2

std::stringタプル内のすべてのアイテムをに変換することは可能const char*ですか?

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

私が直面している問題は、可変長テンプレートをファイルに出力しようとすることです

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

tup の最初の項目はフォーマット文字列 (const char*確かに) で、残りは出力引数です。引数には が含まれる場合がありますstd::string。問題は、それfprintfがかからないことstd::stringです。std::stringタプル内のすべてを別のタプルに変換して形成するにはどうすればよいconst char*ですか?

tupプリントが終了する前に範囲外に出ることはありません。

4

1 に答える 1

2

タプルを単にfprint-ing している場合、それはタプルを別のものに渡すというよりも、タプルを変換するということではありません。インデックス シーケンス トリックを使用して、個々のコンポーネントを引き出すことができます。

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))...
        );
}
于 2016-02-19T15:14:57.887 に答える