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

时间:2013-04-18 18:05:39

标签: c++ templates inheritance

假设我有以下内容:

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();

有什么方法可以解决这个问题吗?我没有能力改变这些类是模板化而不是从基类继承的事实,或者我只是这样做。

2 个答案:

答案 0 :(得分:1)

这在C ++中是不可能的。 A派生自Base这一事实并不意味着TemplatedClass<A>来自TemplatedClass<Base>

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

答案 1 :(得分:0)

您可以从TemplatedClass<T>派生TemplatedClass<Base>,或者通过专门针对Base,或者通过提供这样的虚拟类:

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
{
  //...
};