【发布时间】:2018-10-18 06:53:49
【问题描述】:
假设我有一个名为 loadData() 的函数,它接受一个容器(要填充数据)和一个 CSV 文件。我需要以下重载:
loadData(std::vector<double>& data, const std::string& file);loadData(QVector<double>& data, const std::string& file);loadData(std::vector<std::complex<double>>& data, const std::string& file);loadData(QVector<std::complex<double>>& data, const std::string& file);loadData(std::vector<std::vector<double>>& data, const std::string& file);loadData(QVector<QVector<double>>& data, const std::string& file);loadData(std::vector<std::vector<std::complex<double>>>& data, const std::string& file);loadData(QVector<QVector<std::complex<double>>>& data, const std::string& file);
QVector 是 Qt 的类矢量类,具有类似的 API,但只采用一个模板参数 T(而不是两个,如 std::vector<T, A>)。
1-4 的实现几乎相同(它只是调用 5-8,将单个向量包装在另一个向量中(相同类型!)。
5-8 的实现是一样的(只是调用了 CSV 解析函数的相应重载)。
我可能还需要添加float 重载,或QVector<std::vector<...>> / std::vector<QVector<...>> 重载。
基本上,这是我想概括的大量重载。
是否可以将它们全部组合成 2 个功能模板(一个用于 1D 容器,另一个用于 2D 容器)?
谢谢
【问题讨论】:
-
是的,有可能。试了有没有问题?
-
我不确定如何指定 Container
和 Container > 的模板而不发生冲突。此外,由于 QVector 和 std::vector 具有不同数量的模板参数,模板模板参数必须是可变参数(我不太熟悉),而且我不知道如何指定 2D 案例。 -
它将帮助您分离关注点。想想支持只进迭代器的“data_file_parser”对象。然后从这个对象复制到你的向量/QVector。现在你只需要编写 2 个重载。
-
对于
Container<AnotherContainer<T>>的情况,您将如何判断每个内部AnotherContainer<T>何时完成,以添加到外部Container? -
doublevscomplex<double>vsfloat需要做哪些不同的工作?
标签: c++ templates vector c++17 qvector