2016-01-21 41 views
3

我正在使用Ben strasser C++快速csv分析器:https://github.com/ben-strasser/fast-cpp-csv-parser。它採用了可變參數模板通過列值回while循環處理CSV數據:「解包」數組以調用具有可變參數模板的函數

io::CSVReader<2> in(csv_filename); 
double x, y; 
while(in.read_row(x,y)) { 
    //code with x and y 
} 

這就要求在CSVReader類以下功能:

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] 
} 

但是,這是無效的語法。我需要將雙打數組「解開」爲指向我雙打的單獨參數。我想在不對快速csv解析器進行修改的情況下執行此操作。

回答

4

您可以使用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); 

「工作」 的例子:link


對於編譯器「低於「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...> {}; 
+0

雖然這是一個很好的答案,'的std :: integer_sequence'是從C++ 14 ,問題被標記爲C++ 11。 – SergeyA

+0

@SergeyA - true - 我爲C++添加了這個實現11 – PiotrNycz

+0

* *幾乎可以工作。我收到以下錯誤消息:沒有匹配函數調用'read_row(io :: CSVReader <2u>&,double [2])'。注意:候選是:template void read_row(io :: CSVReader &,T *)。模板參數推導/替換失敗:不匹配類型long unsigned int和'#'ínteger_cst'不受dump_type支持#'。 'io :: CSVReader <2u>'不是來源於'io :: CSVReader ' –

相關問題