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

Templated data types with derived classes

本文关键字:数据类型 派生      更新时间:2023-10-16

假设我有以下内容:

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

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

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

请参阅此堆栈溢出帖子以获取替代方案:从子类的 STL 向量到基类向量的转换

你可以从TemplatedClass<Base>派生TemplatedClass<T>,要么通过专门化 if for 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
{
  //...
};