矢量模板问题
Posted
技术标签:
【中文标题】矢量模板问题【英文标题】:Vector template question 【发布时间】:2011-03-31 10:15:56 【问题描述】:问题,因为我对向量和模板做得不多。
如果我有一个类 foo,它是模板类,并且我想创建一个 foo 指针向量而不考虑 foo 类型,那么语法是什么样的?
【问题讨论】:
【参考方案1】:没有直接的方法可以做到这一点。同一模板的不同实例被视为不同的类,彼此没有关系。
如果您想统一对待它们,一种选择是创建一个基类,然后模板foo
类从该基类继承。例如:
class foo_base
/* ... */
;
template <typename T> class foo: public foo_base
/* ... */
;
现在,您可以创建一个vector<foo_base*>
来存储指向foo_base
对象的指针,这些对象又是foo
的所有特化。
【讨论】:
【参考方案2】:你不会的。类模板foo
(例如foo<int>
、foo<char>
等)的每个实例化都是一个不同的类型。 foo
本身不是类型。
您需要为它们提供一些基类并存储指针,利用多态性。
【讨论】:
【参考方案3】:不可能。当您在任何地方使用类模板时,您需要在类型上实例化它。
一种规避方法是为foo
提供多态接口基类,并拥有这些指针的向量。
class IFoo
virtual void bar() = 0;
virtual int baz() = 0;
;
template<class T>
class Foo : IFoo
// concrete implementations for bar and baz
;
// somewhere in your code:
std::vector<IFoo*> vecFoo.
vecFoo.push_back(new Foo<int>);
明显的问题是,您不需要知道 bar
和 baz
函数的每个可能的返回值。
【讨论】:
【参考方案4】:您不能拥有foo<?>
的向量。编译器在创建向量时需要准确知道它存储的类型,因为foo<?>
的每个实例化都可能具有不同的大小和完全不同的成员(因为您可以提供显式和部分特化)。
您需要给foo<T>
一个公共基类,然后将baseclass
指针放入向量中(最好使用shared_ptr
或类似的东西)。
作为替代方案,有现成的类可以对您隐藏它并充当引用容器。其中有boost::ptr_vector
,不过也需要一个通用的类型来存储。
class common_base
/* functions to access the non-templates parts of a foo<T> .. */
;
template<typename T> class foo : public common_base ;
【讨论】:
【参考方案5】:如果您试图在不指定 T 的情况下模拟概念:“指向 Foo 的指针向量”,那么您正在尝试模拟当前标准不支持的模板类型定义。
解决方法是
template <class T>
my_vector
typedef std::vector<Foo<T>*> type;
如果相反,你可以为你的 Foo 人买得起多态接口,我会按照已经建议的那样做。
【讨论】:
以上是关于矢量模板问题的主要内容,如果未能解决你的问题,请参考以下文章