具有派生类的模板化数据类型

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&lt;A&gt; 派生自 TemplatedClass&lt;Base&gt;

请参阅此 Stack Overflow 帖子以获取替代方案: Conversion from STL vector of subclass to vector of base class

【讨论】:

【参考方案2】:

您可以从TemplatedClass&lt;Base&gt; 派生TemplatedClass&lt;T&gt;,方法是专门为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。

以上是关于具有派生类的模板化数据类型的主要内容,如果未能解决你的问题,请参考以下文章

派生类型的自动静态调用

我无法覆盖基类的方法,因为我的派生类是模板化的

具有模板化返回类型的虚拟成员函数的实例化

模板类与抽象类

选择具有派生类型的基类型的模板特化

模板……基础知识笔记