我想在类向量中存储派生类模板MyClassTemplate
的类。
不幸的是,在C ++中,无法定义MyClassTemplate
的向量而不指定其参数(类似std::vector<MyClassTemplate<?,?>> myVector;
)。
但是有一种可能的解决方案来定义一个非模板化的接口(只有纯虚函数的类)作为向量中项目的类型。 此接口由类模板继承。在我的例子中,类模板只有使用模板参数的成员,所以似乎只有一个空接口才是我的Vector的合适项目类型。
这个问题还有其他(更好的)解决方案吗?
答案 0 :(得分:3)
我从您的问题中理解:
MyClassTemplate<class X, class Y>
; MyClassTemplate<A,B>
和MyClassTemplate<U,V>
)是不同的不相关类型; 如何解决这个问题?
首先,您可以定义一个常见的非模板祖先:
class MyCommonAncestor {
public:
virtual void common_operation1()=0;
virtual ~MyCommonAncestor() {}
};
template <class X, class Y>
class MyTemplateClass : public MyCommonAncestor {
X myx;
Y myY;
public:
void common_operation1() override;
X operation2(const Y& y);
};
不幸的是,这样做实际上并不允许你使用vector<MyCommonAncestor>
因为这样的向量只能保存MyCommonAncestor
个对象(因为它们在这里有一个纯虚函数而无法创建)如果可以创建它们,它们会slice您放入的派生对象(即它们可能会丢失myX
和myY
。
但是你可以创建一个指针向量。我在这里展示了一个简单的例子来说明,使用原始指针;但实际上你最好使用shared_ptr
:
vector<MyCommonAncestor*> myVector;
myVector.push_back(new MyTemplateClass<A,B>);
myVector.push_back(new MyTemplateClass<U,V>);
然后,您可以根据MyCommonAncestor
的界面迭代元素并应用常用函数。
挑战
当您想要调用依赖于模板参数的函数时,会发生挑战(例如operation2()
)。显然,这些不能包括在共同的祖先中,因为它们依赖于尚未定义的模板参数。
可能的解决方法: