c++ - C++ 中的迭代器和模板

标签 c++ c++11

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

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 */ };

现在只使用可以容纳Fruits 的引用包装器类型或类型删除指针的vector:

for (fruit : v) {
    fruit.getColor();
}

更高级的解决方案

您可以使用 Boost.TypeErasurecreate a concept这将具有您想要的行为。

关于c++ - C++ 中的迭代器和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20642624/

相关文章:

c++ - 如何在 C 编程中做到像 "with"(Pascal)?

c++ - 用qml ListView显示Json数据

c++ - 在这种情况下我应该使用顶点着色器吗?

c++ - 使用类定义中的推断维度初始化静态常量多维数组

c++ - 如何在模板类中实现 move 语义

java - CAS 是一个像自旋一样的循环吗?

c++ - 成员引用基类型 'int' 不是结构或 union

C++11:模板编程

c++ - 如何使用模板找到参数 T 的最大可解引用级别

c++11 - 使用自定义张量数据结构的 boost::odeint 输出错误