【发布时间】:2018-12-28 03:59:42
【问题描述】:
假设我有一个模板类,例如:
template <class type, size>
class myTemplate
我有一个抽象基类:
class myDataType
以及各种派生类
class subDataType1 : public myDataType
class subDataType2 : public myDataType
...
class subDataTypeN : public myDataType
我想做的是打电话:
myTemplate<myDataType, size> myObject;
但是,这显然行不通,因为在模板内部,我将实例化一个抽象类的对象。基本上,我希望模板可以与我的任何一个派生类一起使用,但我不知道如何机械化它(来自 Java,其中“解决方案”或诸如类型通配符和“对象”之类的变通方法可能已经允许我至少可以通过编译器的检查)。
我真正想要的是不改变我的模板类,允许多种数据类型而不实例化我的模板类的多个对象。
我应该提到,我知道解决此问题的方法可能涉及如下调用:
myTemplate<myDataType*, size> myObject
但我可能需要更多细节,因为我是 C++ 新手(我不知道我不知道什么)。
【问题讨论】:
-
相当广泛。如果没有具体的用例,很难提出好的建议。您可以允许任何类,然后使用
static_assert来确保在编译时提供的类是myDataType的子类。寻找一个好的副本。这里有一些信息:en.cppreference.com/w/cpp/types/is_base_of 和 en.cppreference.com/w/cpp/language/static_assert -
我们开始吧:How to ensure that the template parameter is a subtype of a desired type?。我不确定这是不是重复,但这是一个值得研究的方向。
-
旁注:值得reading about Object Slicing,这样您就可以在从Java 迁移时避免那种讨厌的小冲击。
-
由于 IP 限制,我无法提供我的确切代码,但如果我为我想做的事情提供更多背景/动机,也许会有所帮助。我正在编写嵌入式代码,处理循环缓冲区。在我的例子中,myTemplate 是一个循环缓冲区,在编译时,它会保留“myDataType”块的“大小”数量。现在,因为我正在使用嵌入式,我不能简单地实例化几个循环缓冲区(每个子类一个),因为我的内存非常有限。我基本上只希望我的单个循环缓冲区接受任何 subDataTypen。
标签: c++ abstract-class derived-class template-classes