我有以下层次结构。文件是:
vector<Dataset<here lies the problem!!!>>
然后我希望每个数据集都是:
vector<Record>
但是Record是一种模板类型,就是你创建一个像这样的数据集:
Dataset<Record> dataset;
我需要能够遍历数据集,然后遍历每个数据集 迭代记录,但我不能,因为每个数据集都有自己的 不同的记录,所以基本上每个数据集都是不同的类型, 我不能在矢量中使用不同的类型。
更多澄清:
数据集是一个CSV数据集,我指的是更多CSV行。 记录基本上是一个CSV行,但代表 由用户指定的结构。
迭代并没有那么多,因为它也与存储有关。我们可能有20个数据集,我们希望将它们存储在一个结构中,如矢量或其他东西。所以这不仅仅是迭代。
答案 0 :(得分:2)
如果它们属于不同类型,则迭代它们没有意义;什么代码会在每种类型的数据集上运行?
找到这个问题的答案后,抽象出该信息并将其用作接口并使数据集继承或使用某些TMP类型擦除。
class Apple { ... };
class Pear { ... };
vector<SomeTypeThatCanHoldApplesAndPears> v;
for (x : v) {
// what do you want to do with x?
}
一个充实的例子:
// They are both fruits and have a color!
class Fruit { public: virtual Color getColor() = 0; }
class Apple : public Fruit { /* implement getColor */ };
class Pear : public Fruit { /* implement getColor */ };
现在只使用vector
引用包装器类型的指针或类型擦除来保存Fruit
s:
for (fruit : v) {
fruit.getColor();
}
您可以使用具有所需行为的Boost.TypeErasure
和create a concept。
答案 1 :(得分:0)
以下是您可以做的事情:
template <typename R>
struct DataSet
{
typedef R record_type;
};
int main()
{
std::vector<boost::variant<DataSet<int>, DataSet<std::string>>> datasets;
}
请点击此处了解详情http://www.boost.org/doc/libs/1_55_0/doc/html/variant.html