假设我有以下内容:
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();
有什么方法可以解决这个问题吗?我没有能力改变这些类是模板化而不是从基类继承的事实,或者我只是这样做。
答案 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
{
//...
};