我有以下层次结构。一个文件是:
vector<Dataset<here lies the problem!!!>>
然后我希望每个数据集是:
vector<Record>
但是 Record 是一个模板类型,也就是说你创建一个 Dataset 是这样的:
Dataset<Record> dataset;
我需要能够遍历数据集,然后针对每个数据集 遍历记录,但我不能,因为每个数据集都有自己的 不同的记录,所以基本上每个数据集都是不同的类型, 我不能在一个 vector 中有不同的类型。
更多说明:
Dataset 是一个 CSV 数据集,我的意思是更多的 CSV 行。 一条记录基本上是一条 CSV 行,但代表 通过用户指定的结构。
这与迭代无关,因为它也与存储有关。我们可能有 20 个数据集,我们希望将它们存储在一个结构中,例如 vector 或其他结构。所以这不仅仅是关于迭代。
最佳答案
如果它们属于不同类型,迭代它们就没有意义;什么代码会在每种类型的数据集上运行?
一旦找到这个问题的答案,抽象该信息并用作接口(interface)并使数据集继承它或使用某种 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 */ };
现在只使用可以容纳Fruit
s 的引用包装器类型或类型删除指针的vector
:
for (fruit : v) {
fruit.getColor();
}
更高级的解决方案
您可以使用 Boost.TypeErasure
和 create a concept这将具有您想要的行为。
关于c++ - C++ 中的迭代器和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20642624/