Pretty-Printing std::tuple
STL コンテナーの装飾に関する以前の質問で、包括的で優雅なソリューションの開発に成功しました。この次のステップでは、可変長引数テンプレート (C 11 のみ) を使用したきれいに印刷する std::tuple の領域を詳しく掘り下げます。
Background
std::pair の場合、構文は簡単:
std::ostream & operator<<(std::ostream &, const std::pair<S, T> &);
タプルの類似構造
パズルは、タプルを出力するための類似構造を定義することにあります。私たちはこの動作を目指しています:
auto a = std::make_tuple(5, "Hello", -0.1); std::cout << a << std::endl; // prints: (5, "Hello", -0.1)
解決策
答えはインデックスを活用することにあります:
namespace aux{ template<std::size_t... Is> struct seq{}; template<std::size_t N, std::size_t... Is> struct gen_seq : gen_seq<N-1, N-1, Is...>{}; template<std::size_t... Is> struct gen_seq<0, Is...>: seq<Is...>{}; template<class Ch, class Tr, class Tuple, std::size_t... Is> void print_tuple(std::basic_ostream<Ch, Tr>& os, Tuple const& t, seq<Is...>){ using swallow = int[]; (void)swallow{0, (void(os << (Is == 0? "": ", ") << std::get<Is>(t)), 0)...}; } } // aux:: template<class Ch, class Tr, class... Args> auto operator<<(std::basic_ostream<Ch, Tr>& os, std::tuple<Args...> const& t) -> std::basic_ostream<Ch, Tr>& { os << "("; aux::print_tuple(os, t, aux::gen_seq<sizeof...(Args)>()); return os << ")"; }
ボーナス: 区切り文字
柔軟性を高めるために、部分的な特殊化:
// Delimiters for tuple template<class... Args> struct delimiters<std::tuple<Args...>, char> { static const delimiters_values<char> values; }; template<class... Args> const delimiters_values<char> delimiters<std::tuple<Args...>, char>::values = { "(", ", ", ")" }; template<class... Args> struct delimiters<std::tuple<Args...>, wchar_t> { static const delimiters_values<wchar_t> values; }; template<class... Args> const delimiters_values<wchar_t> delimiters<std::tuple<Args...>, wchar_t>::values = { L"(", L", ", L")" };
結論
上記の変更により、整形印刷 std::tuple をカスタマイズして、さまざまな文字セットや区切り文字の設定に対応できるようになり、エレガントで多用途なソリューション。
以上がC 11 で可変個引数テンプレートを使用して `std::tuple` をきれいに出力するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。