"Unpack" 一个用可变参数模板调用函数的数组
"Unpack" an array to call a function with variadic template
我正在使用 ben strasser C++ 快速 csv 解析器:https://github.com/ben-strasser/fast-cpp-csv-parser。它使用可变参数模板将列值传递回处理 csv 数据的 while 循环:
io::CSVReader<2> in(csv_filename);
double x, y;
while(in.read_row(x,y)) {
//code with x and y
}
这会在 CSVReader class 中调用以下函数:
template<class ...ColType>
bool read_row(ColType& ...cols){
//snip
}
我的 x 和 y 值对我来说效果很好。但是,我想将其扩展为使用任意维度。这意味着我的数据有我需要阅读的(已知)列数。我想使用这样的东西:
io::CSVReader<known_dimension> in(csvfname);
double data[known_dimension];
while(in.read_row(data)) {
//code with data[0],data[1],...,data[known_number]
}
但是,这不是有效的语法。我需要 "unpack" 将双打数组转换为指向我的双打的指针的单独参数。我想在不修改快速 csv 解析器的情况下执行此操作。
您可以为此目的使用 std::integer_sequence
:
namespace Detail
{
template <typename Reader, typename T, std::size_t... I>
void read_row(Reader& in, T* data, std::index_sequence<I...>)
{
in.read_row(data[I]...); // A trick here
}
}
template <std::size_t N, typename T>
void read_row(io::CSVReader<N>& in, T* data)
{
Detail::read_row(in, data, std::make_index_sequence<N>{});
}
当然,像这样使用:
int a[7];
io::CSVReader<7> r;
read_row(r, a);
"Working" 示例:link
对于编译器 "below" C++14 - integer_sequence
(实际上只需要 index_sequence
)很容易实现:
template <std::size_t... I>
class index_sequence {};
并且 make_index_sequence
不是那么容易 - 但也是可行的:
template <std::size_t N, std::size_t ...I>
struct make_index_sequence : make_index_sequence<N-1, N-1,I...> {};
template <std::size_t ...I>
struct make_index_sequence<0,I...> : index_sequence<I...> {};
我正在使用 ben strasser C++ 快速 csv 解析器:https://github.com/ben-strasser/fast-cpp-csv-parser。它使用可变参数模板将列值传递回处理 csv 数据的 while 循环:
io::CSVReader<2> in(csv_filename);
double x, y;
while(in.read_row(x,y)) {
//code with x and y
}
这会在 CSVReader class 中调用以下函数:
template<class ...ColType>
bool read_row(ColType& ...cols){
//snip
}
我的 x 和 y 值对我来说效果很好。但是,我想将其扩展为使用任意维度。这意味着我的数据有我需要阅读的(已知)列数。我想使用这样的东西:
io::CSVReader<known_dimension> in(csvfname);
double data[known_dimension];
while(in.read_row(data)) {
//code with data[0],data[1],...,data[known_number]
}
但是,这不是有效的语法。我需要 "unpack" 将双打数组转换为指向我的双打的指针的单独参数。我想在不修改快速 csv 解析器的情况下执行此操作。
您可以为此目的使用 std::integer_sequence
:
namespace Detail
{
template <typename Reader, typename T, std::size_t... I>
void read_row(Reader& in, T* data, std::index_sequence<I...>)
{
in.read_row(data[I]...); // A trick here
}
}
template <std::size_t N, typename T>
void read_row(io::CSVReader<N>& in, T* data)
{
Detail::read_row(in, data, std::make_index_sequence<N>{});
}
当然,像这样使用:
int a[7];
io::CSVReader<7> r;
read_row(r, a);
"Working" 示例:link
对于编译器 "below" C++14 - integer_sequence
(实际上只需要 index_sequence
)很容易实现:
template <std::size_t... I>
class index_sequence {};
并且 make_index_sequence
不是那么容易 - 但也是可行的:
template <std::size_t N, std::size_t ...I>
struct make_index_sequence : make_index_sequence<N-1, N-1,I...> {};
template <std::size_t ...I>
struct make_index_sequence<0,I...> : index_sequence<I...> {};