一个应用程序需要处理一组可以执行某些操作的数据集。每个数据集包含特定数据类型(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*>() );
这样做的正确方法是什么?或者处理具有不同值类型的对象集合,我可以在其上执行相同的操作?
答案 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
。