矢量模板问题

时间:2011-03-31 10:15:57

标签: c++ templates vector

问题,因为我对矢量和模板没有做太多。

如果我有一个类模板,它是模板类,我想创建一个foo指针向量而不管foo类型,语法是什么样的?

5 个答案:

答案 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>);

明显的问题是,您无需知道barbaz函数的每个可能的返回值。

答案 4 :(得分:0)

如果你试图模仿概念:“指向Foo的指针的向量”而不指定T,你试图模拟当前标准不支持的模板typedef。

解决方法是

template <class T>
my_vector
{
   typedef std::vector<Foo<T>*> type;
}

相反,如果您可以为您的Foo家伙提供多态接口,我会这样做,因为它已经建议。