问题,因为我对矢量和模板没有做太多。
如果我有一个类模板,它是模板类,我想创建一个foo指针向量而不管foo类型,语法是什么样的?
答案 0 :(得分:4)
没有直接的方法可以做到这一点。同一模板的不同实例被视为不同的类,彼此无关。
如果要统一对待它们,可以选择创建模板foo
类继承的基类。例如:
class foo_base {
/* ... */
};
template <typename T> class foo: public foo_base {
/* ... */
};
现在,您可以创建一个vector<foo_base*>
来存储指向foo_base
个对象的指针,这些对象又是foo
的所有特化。
答案 1 :(得分:2)
你不会。类模板foo
的每个实例化(例如foo<int>
,foo<char>
等)都是不同类型。 foo
本身不是类型。
你需要一些基类来存储指针,利用多态性。
答案 2 :(得分:1)
你不能拥有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 { };
答案 3 :(得分:1)
不可能。在任何地方使用类模板时,需要在类型上实例化
绕过这种情况的一种可能性是为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 :(得分:0)
如果你试图模仿概念:“指向Foo的指针的向量”而不指定T,你试图模拟当前标准不支持的模板typedef。
解决方法是
template <class T>
my_vector
{
typedef std::vector<Foo<T>*> type;
}
相反,如果您可以为您的Foo家伙提供多态接口,我会这样做,因为它已经建议。