Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah anda boleh mencetak cantik `std::tuple` menggunakan templat variadic dan pembatas tersuai?

Bagaimanakah anda boleh mencetak cantik `std::tuple` menggunakan templat variadic dan pembatas tersuai?

Susan Sarandon
Lepaskan: 2024-11-08 07:27:01
asal
1168 orang telah melayarinya

How can you pretty-print `std::tuple` using variadic templates and custom delimiters?

Pretty-Printing std::tuple

Dalam soalan sebelumnya, kami mencipta penyelesaian yang elegan untuk bekas STL yang cantik-cetak. Sekarang, mari kita atasi pencetakan cantik untuk std::tuple menggunakan templat variadic.

Untuk std::pair, kita boleh mencetak menggunakan operator tersuai:

std::ostream &operator<<(std::ostream &o, const std::pair<S,T> &p)
{
  return o << "(" << p.first << ", " << p.second << ")";
}
Salin selepas log masuk

Untuk menyamaratakan ini kepada tupel, kita boleh memanfaatkan pembongkaran hujah templat dan penjanaan indeks:

namespace aux{
template<std::size_t... Is> struct seq{}; // dummy helper type

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...>){ // overload to print tuples
  using swallow = int[]; // silence unused warning
  (void)swallow{0, (void(os << (Is == 0? "" : ", ") << std::get<Is>(t)), 0)...}; 
}
}

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)>()); // call template overload with index helper to print
  return os << ")";
}
Salin selepas log masuk

Untuk menambah pembatas tersuai (cth., untuk char dan wchar_t), kita boleh menggunakan pengkhususan separa:

// 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")" };
Salin selepas log masuk

Dan menyesuaikan pengendali<< dan print_tuple dengan sewajarnya:

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>&
{
  typedef std::tuple<Args...> tuple_t;
  if(delimiters<tuple_t, Ch>::values.prefix != 0)
    os << delimiters<tuple_t,char>::values.prefix;

  print_tuple(os, t, aux::gen_seq<sizeof...(Args)>());

  if(delimiters<tuple_t, Ch>::values.postfix != 0)
    os << delimiters<tuple_t,char>::values.postfix;

  return os;
}

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...>){ 
  char const* delim = delimiters<Tuple, Ch>::values.delimiter;
  if(!delim) delim = "";
  (void)swallow{0, (void(os << (Is == 0? "" : delim) << std::get<Is>(t)), 0)...};
}
Salin selepas log masuk

Kini, pencetakan std::tuple dengan pembatas tersuai adalah semudah:

auto a = std::make_tuple(5, "Hello", -0.1);
std::cout << a << std::endl; // prints: (5, "Hello", -0.1)
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah anda boleh mencetak cantik `std::tuple` menggunakan templat variadic dan pembatas tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan