矢量模板问题

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&lt;foo_base*&gt; 来存储指向foo_base 对象的指针,这些对象又是foo 的所有特化。

【讨论】:

【参考方案2】:

你不会的。类模板foo(例如foo&lt;int&gt;foo&lt;char&gt; 等)的每个实例化都是一个不同的类型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>);

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

【讨论】:

【参考方案4】:

您不能拥有foo&lt;?&gt; 的向量。编译器在创建向量时需要准确知道它存储的类型,因为foo&lt;?&gt; 的每个实例化都可能具有不同的大小和完全不同的成员(因为您可以提供显式和部分特化)。

您需要给foo&lt;T&gt; 一个公共基类,然后将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 人买得起多态接口,我会按照已经建议的那样做。

【讨论】:

以上是关于矢量模板问题的主要内容,如果未能解决你的问题,请参考以下文章

如何为矢量专门化一个类模板?

C++ 3D 矢量模板

如何将矢量元素提供给模板

为啥 MSVC12 的自动矢量化器不分析函数模板?

C++ 矢量模板每组件操作

BST模板类中使用的矢量模板类