首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有不同值类型模板参数的模板类的C++数组或矢量

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

Stack Overflow用户
提问于 2014-07-30 18:22:40
回答 2查看 1.8K关注 0票数 1

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

How to put different template types into one vector之后,可以使用继承或boost变量来放置具有不同类型参数的模板类。

我希望避免使用变量,并且希望保留值类型。

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

代码语言:javascript
复制
    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*>() );

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

EN

回答 2

Stack Overflow用户

发布于 2014-07-30 18:28:44

如果有一个固定的范围,你可以使用boost::variant,否则考虑使用boost::any

票数 0
EN

Stack Overflow用户

发布于 2014-07-30 18:27:12

你可以这样做:

代码语言:javascript
复制
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查询元素的类型

代码语言:javascript
复制
`if (typeid(*elements[0]) == typeid(Data<int>))`

不过,这种方法会招致运行时惩罚,就像使用boost变体一样。如果事先知道每个字段的类型,那么明智的做法是使用tuple

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25034400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档