C ++数组或具有不同值类型模板参数的模板类的向量

时间:2014-07-30 10:22:40

标签: c++ templates vector value-type

一个应用程序需要处理一组可以执行某些操作的数据集。每个数据集包含特定数据类型(int32,int16,float,complex)的点数组,并且可以对每个数据集中包含的数据执行相同的操作。例如傅立叶变换或滤波器。所以在数据模型中(在模型 - 视图 - 控制器模式中使用),我想存储开放数据集的集合,每个集合都有自己的数据类型。

How to put different template types into one vector之后,使用不同类型参数的模板类可以使用继承或增强变体。

我想避免使用变体,我想保留值类型。

我想要的是存储具有不同模板参数的类的向量(如果可能,数组会更好):

    template < typename T >
    class DataSet {
      private:
      T data;
      // ...
       public:
      T getData() {return data;}
    };

    std::vector< DataSet< something > > v;
    v.push_back( DataSet<int32_t*>() );
    v.push_back( DataSet<float*>()   );
    v.push_back( DataSet<int16_t*>() );

这样做的正确方法是什么?或者处理具有不同值类型的对象集合,我可以在其上执行相同的操作?

2 个答案:

答案 0 :(得分:0)

如果有固定范围,您可以使用boost::variant,否则请考虑boost::any

答案 1 :(得分:-2)

您可以这样做:

struct Base {};
template <class T> struct Data : public Base { T x; };
vector<Data*> elements;
elements.push_back(new Data<int>{3});
elements.push_back(new Data<char>{'a'});

使用指针的原因是所有向量元素必须具有相同的大小,因此我们不能直接存储对象,而是强制使用指针。然后,您可以使用typeid来查询元素的类型

`if (typeid(*elements[0]) == typeid(Data<int>))`

这种方法会产生运行时损失,就像使用boost变体一样。如果您事先知道每个字段的类型,则最好使用tuple