我正在开发一种模块化数据记录器,可以记录不同类型的数据。目前我制作了一个模板的File类。为了声明这样一个类的对象,可以这样做:File<double> f("filename.txt")
或File<float> f("filename.txt")
。我希望能够将使用double
或float
声明的对象作为模板参数存储在一个向量中。有可能做那样的事吗?我尝试过一种在线使用联合的方法:
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类型,不能在操作<<
中使用。怎么会绕过这样的错误?
答案 0 :(得分:1)
我认为你的工会矢量可能有一些问题。我没有看过你的完整代码,但请参考:
答案 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会自动为你做。