c ++中的迭代器和模板

时间:2013-12-17 19:09:41

标签: c++ c++11

我有以下层次结构。文件是:

vector<Dataset<here lies the problem!!!>>

然后我希望每个数据集都是:

vector<Record>

但是Record是一种模板类型,就是你创建一个像这样的数据集:

Dataset<Record> dataset;

我需要能够遍历数据集,然后遍历每个数据集 迭代记录,但我不能,因为每个数据集都有自己的 不同的记录,所以基本上每个数据集都是不同的类型, 我不能在矢量中使用不同的类型。

更多澄清:

数据集是一个CSV数据集,我指的是更多CSV行。 记录基本上是一个CSV行,但代表 由用户指定的结构。

迭代并没有那么多,因为它也与存储有关。我们可能有20个数据集,我们希望将它们存储在一个结构中,如矢量或其他东西。所以这不仅仅是迭代。

2 个答案:

答案 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.TypeErasurecreate 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