存储不同类型的数据c ++

时间:2014-04-01 23:17:47

标签: c++ types

我正在开发一种模块化数据记录器,可以记录不同类型的数据。目前我制作了一个模板的File类。为了声明这样一个类的对象,可以这样做:File<double> f("filename.txt")File<float> f("filename.txt")。我希望能够将使用doublefloat声明的对象作为模板参数存储在一个向量中。有可能做那样的事吗?我尝试过一种在线使用联合的方法:

union typ {
    int int_dat;
    double double_dat;
    float float_dat;
}  

并允许我声明一个向量:vector<File<typ> >。但是,这给了我链接器错误。尝试这种方法有更简单,更清洁的方法吗?有问题的整个项目是here

编辑:跟进此事。如果我进行这样的操作,如何绕过这个问题:

std::vector<File<typ> > files;

File<typ> f("test.txt");
files.push_back(f);
files.at(0) << 35.4;

它会导致编译时错误,我所理解的是:35.4不是typ类型,不能在操作<<中使用。怎么会绕过这样的错误?

3 个答案:

答案 0 :(得分:1)

我认为你的工会矢量可能有一些问题。我没有看过你的完整代码,但请参考:

Questions about vector, union, and pointers in C++

答案 1 :(得分:1)

以下内容应该有效(请参阅http://codepad.org/TyrURyar

#include <vector>

union type {
    int int_dat;
    double double_dat;
    float float_dat;
};

template <typename T>
class Foo {
    T t;
};

void foo2() {
    std::vector<Foo<type> >  x;    
    // NOTE: In pre-C++11, space is required between the >'s
}

答案 2 :(得分:1)

如果可以,请使用Boost::Variant。这是一个更清洁的选择。可以使用联盟,但你应该从同一个成员if you don't want to end up with undefined behaviour写入和阅读,即它涉及簿记,无论如何Variant会自动为你做。