我正在设计一个C++库,它从一些实验中读取报告数据的CSV文件,并进行一些聚合并输出一个pgfplots代码.我想使库尽可能通用且易于使用.我还希望将其与CSV文件中表示的数据类型隔离开来,并将选项留给用户按照自己的意愿解析每个列.我也想避免使用Boost Spirit Qi或其他重型解析器.
我所拥有的简单解决方案是让用户为每个列创建一个类型,其构造函数采用"char*".构造函数自己解析它给出的值,它是数据中的一个单元格.然后用户传给我一个类型列表; 模式,表示一行数据中的类型.我使用这个类型列表来创建一个元组,其中元组的每个成员都负责解析自身.
现在的问题是如何初始化(构造)这个元组.处理元组当然不是直截了当的,因为迭代它们的元素主要是编译时操作.我最初使用Boost Fusion来完成这项任务.但是,我使用的函数(转换)虽然可能将元组作为输入(使用适当的适配器),但它似乎不返回元组.我需要将返回值作为元组,因此其他一些代码可以将它用作关联的类型到值的容器(通过类型via访问它std::get<T>),而只使用标准工具,即不使用Boost.所以我不得不将返回的任何Fusion转换为std :: tuple.
我的问题是如何避免这种转换,更好的是如何完全避免Boost Fusion.
想到一个简单的解决方案是使用std :: tuple的构造函数,并以某种方式将每个元素传递给它需要构造的相应"const*".然而,尽管使用一些复杂的基于模板的枚举技术是可能的,但我想知道是否有一种简单的"参数包"式方法,或者更简单的方法将值传递给单个元素的构造函数.元组.
为了澄清我在寻找什么,请看下面这段代码.
#include <cstdio>
#include <array>
template <typename...> struct format {};
template <typename...> struct file_loader {};
template <typename... Format>
struct
file_loader<format<Format...> > {
void load_file() {
size_t strsize = 500u;
char *str = new char[strsize]();
auto is = fopen("RESULT","r");
/* example of RESULT:
dataset2,0.1004,524288
dataset1,0.3253,4194304
*/
while(getline(&str, &strsize, is) >= 0) {
std::array<char*, 3> toks{};
auto s = str;
int i = 2;
while(i --> …Run Code Online (Sandbox Code Playgroud)