我正在尝试创建一个模板类,其中包含一个静态的对象列表,其中只有一个对象。到目前为止我的工作原理,但它为我提供了每个不同类型的B类参数的“mylist”副本。我如何更改它,以便我为B类的所有实例化获取一个“mylist”,而不管模板参数如何?
这就是我所拥有的:
template <class T> class A {
...
};
template <class T> class B {
static list<A<T> > mylist;
...
};
template <class T> list< A<T> > B<T>::mylist;
提前致谢:)
答案 0 :(得分:4)
如何更改它以便我只有一个副本
您可以从公共(非模板化)基类继承,以确保每个模板实例化都没有实例。
...包含任何类型?
这取决于您的期望。我将从您的示例中假设“任何类型”表示“模板类A
的任何实例化”。
由于这些类型的大小可能不同,因此您最好保留指向对象的指针。
这是解决这两个问题的解决方案的一个示例。
class ACommon {
// Put a common virtual interface here.
};
template <class T> class A : public ACommon {
};
class BCommon {
// You'll have a single, common static here.
static list<shared_ptr<ACommon> > mylist;
};
template <class T> class B : public BCommon{
};
答案 1 :(得分:1)
你不能“只是”在列表中有任何类型,并排生活。根据您对该列表的期望以及其中的对象,有几件事要做。
Drew解决方案的替代方案是:
如果您想要所有实例化的单个列表,那么您肯定需要BCommon
。如果您不想隐藏接口后面的A类型,可以使用Boost :: any或Boost :: variant来保存A对象。