2016-02-19 23 views
1

是否可以將元組內的所有std::string項目轉換爲const char*有沒有辦法將元組轉換爲具有不同項目類型的另一個元組?

template<typename... Ts> 
std::tuple<Ts...> tup 

我面臨的問題是我嘗試打印可變參數模板到文件

fprintf(file, std::get<Idx>(tup)...) 

在TUP的第一個項目是格式字符串(const char*肯定的),其餘的都是打印ARGS。該參數可能包含std::string。問題是fprintf不需要std::string。如何將元組內的所有std::string轉換爲const char*並形成另一個元組?

tup在完成打印之前不會出現範圍。

+1

這些const char *的生命期應該是什麼?它們應該與'std :: string'一起銷燬嗎?它們是否應該動態分配,然後在某個時候刪除? – TartanLlama

+0

@TartanLlama我只是更新我的問題,那就是我面臨的問題。 – kzhdev

+0

也許這個問題可以幫助你:http://stackoverflow.com/questions/29820104/equivalent-of-stdtransform-for-tuples或這一個:http://stackoverflow.com/questions/5235246/transform-variadic-template α參數到另一個類型 – Ferruccio

回答

2

如果我們只是fprint-元組,那麼不是轉換元組只是將它傳遞給其他東西。我們可以使用索引列把戲拉出各個組件:

template <class... Ts> 
void fprintf_tuple(FILE* file, std::tuple<Ts...> const& tuple) { 
    fprintf_tuple(file, tuple, std::index_sequence_for<Ts...>{}); 
} 

一旦我們有了單獨的組件,我們只需要一個轉換器:

template <class T> T const& convert_for_printing(T const& val) { return val; } 
const char* convert_for_printing(std::string const& val) { return val.c_str(); } 

然後調用上的一切:

template <class... Ts, std::size_t... Is> 
void fprintf_tuple(FILE* file, std::tuple<Ts...> const& tuple, std::index_sequence<Is...>) 
{ 
    fprintf(file, 
     convert_for_printing(std::get<Is>(tuple))... 
     ); 
} 
相關問題