【问题标题】:Using static variables with templates在模板中使用静态变量
【发布时间】:2012-02-02 21:46:03
【问题描述】:

我正在尝试创建一个模板类,其中包含一个静态对象列表,其中只有一个。到目前为止我所做的工作,但它为我提供了每种不同类型的 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;

提前致谢:)

【问题讨论】:

  • 您从根本上误解了模板。给定template&lt;class T&gt; class Foo;,不同Ts 的Foo&lt;T&gt; 的每个实例都是完全不同的类型。因此,如果Foo&lt;&gt; 包含静态数据成员,则不同Ts 的Foo&lt;T&gt; 的每个实例都将包含不同的静态数据成员。要拥有一个可以包含不同类型的数据成员,请查看Boost.Variant,如果所有类型都事先已知,否则查看Boost.Any。 (但实际上,你的设计一开始就很值得怀疑。)

标签: c++ templates stl static member


【解决方案1】:

如何更改它以便我只有一份副本

您可以从一个通用(非模板化)基类继承,以确保每个模板实例化都没有一个实例。

...包含任何类型?

这取决于您的期望。我将从您的示例中假设“任何类型”意味着“模板类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{

};

【讨论】:

    【解决方案2】:

    您不能“仅仅”在列表中包含任何类型,并排生活。根据您希望对该列表执行的操作以及其中的对象,有几件事情要做。

    Drew 解决方案的替代方案是: 如果您想要所有实例化的单个列表,您肯定需要BCommon。如果您不想将 A 类型隐藏在接口后面,可以使用 Boost::any 或 Boost::variant 来保存 A 对象。

    【讨论】:

    • 是的,boost::anyboost::variant 在这里是很好的用例。不错。
    • 'boost::variant' 在新手手中有点危险;因为它是一个联合体,所以它假定最大类型的大小。一个新手,在没有注意到的情况下,可能会浪费大量内存,只是将一个大对象存储在一百万个'int'旁边。 'boost::any' 是另一回事。尽管它不会由于错误的强制转换(如 void *)而导致未定义的行为,但由于未处理的“bad_cast_exception”,它可能会使您的程序“在现场”崩溃。恕我直言,对于 %90 的情况,您的解决方案是可行的方法。
    猜你喜欢
    • 2010-10-11
    • 2010-12-05
    • 2019-05-10
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多