具有派生类的模板化数据类型
Posted
技术标签:
【中文标题】具有派生类的模板化数据类型【英文标题】:Templated data types with derived classes 【发布时间】:2013-04-18 18:05:38 【问题描述】:假设我有以下内容:
class Base
protected:
Base()
;
class A : public Base
;
class B : public Base
;
现在假设我用模板来做这个:
TemplatedClass<Base> *generic = new TemplatedClass<A>();
它不起作用,我相信我明白为什么,但我想知道我是否可以做类似的事情。我有几个表单的模板专业化
typedef TemplatedClass<A> ASpec;
typedef TemplatedClass<B> BSpec;
typedef TemplatedClass<C> CSpec;
我有一个变量,我想将其类型推迟到运行时,以便我可以动态分配它
if(condition1)
generic = new ASpec();
else if(condition2)
generic = new BSpec();
有没有办法解决这个问题?我没有能力改变类是模板化的并且不是从基类继承的事实,或者我会这样做。
【问题讨论】:
TemplatedClass
定义在哪里?
当然不行。没有名为 TemplatedClass
的模板。没有人会猜到这个模板的作用。
TemplatedClass 代表一个用于本问题目的的虚构类模板。假装我用 std::vector 替换了 TemplatedClass。我的问题不是关于我编写的特定代码,而是关于分配是否对 any 模板专业化有效。
对于std::vector
,没有。对于其他一些模板,也许。这取决于模板。
【参考方案1】:
这在 C++ 中是不可能的。
A
派生自 Base
的事实并不意味着 TemplatedClass<A>
派生自 TemplatedClass<Base>
。
请参阅此 Stack Overflow 帖子以获取替代方案: Conversion from STL vector of subclass to vector of base class
【讨论】:
【参考方案2】:您可以从TemplatedClass<Base>
派生TemplatedClass<T>
,方法是专门为Base
设置if,或者提供一个像这样的虚拟类:
struct Dummy ;
template <typename T>
struct BaseClass<T>
typedef TemplatedClass<Base> Type;
;
template <>
struct BaseClass<Base>
typedef Dummy Type;
;
template <typename T>
struct TemplatedClass : BaseClass<T>::Type
//...
;
【讨论】:
谢谢,安吉。如果我能够在该级别进行更改,这就是我要走的路,但我必须使用已定义的 TemplateClass。以上是关于具有派生类的模板化数据类型的主要内容,如果未能解决你的问题,请参考以下文章