1

假设我有以下内容:

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

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

4

2 回答 2

1

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

有关替代方法,请参阅此 Stack Overflow 帖子: 从子类的 STL 向量转换为基类的向量

于 2013-04-18T18:28:15.093 回答
0

您可以通过专门化 if for或提供像这样的虚拟类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
{
  //...
};
于 2013-04-18T18:15:21.420 回答