Suponha que uma tupla deva ser exibida em um formato separado por vírgula:
#include <iostream>
#include <tuple>
template <typename TupleT, std::size_t... Is>
void printTupleImp(const TupleT& tp, std::index_sequence<Is...>) {
size_t index = 0;
std::cout << "(";
( ((index++ > 0 ? (std::cout << ", ", true) : true),
void(std::cout << std::get<Is>(tp))), ... );
std::cout << ")";
}
template <typename TupleT, std::size_t TupSize = std::tuple_size_v<TupleT>>
void printTuple(const TupleT& tp) {
printTupleImp(tp, std::make_index_sequence<TupSize>{});
}
int main() {
std::tuple tp { 10, 20, "hello"};
printTuple(tp);
}
Saída:(10, 20, hello)
Parece que a otimização da expressão dobrada foi bastante eficiente Compiler Explorer .
Existe uma maneira de fazer o mesmo usando apenas fmt em vez de enviar para um ostream
primeiro, como aqui ?
Se isso envolve fmt::formatter
especialização, como gerar uma string de formato?
Versões recentes do fmt (especificamente, fmt 6.0.0 e superiores) suportam formatação de intervalos e tuplas. Consulte Formatação de intervalo e tupla na documentação.
Se quiser personalizar bastante a formatação de uma tupla ou se estiver trabalhando com uma versão muito antiga do fmt, você também pode emulá-la da seguinte maneira:
Veja o exemplo ao vivo no Compiler Explorer .
Se você quiser um formatador personalizado que faça isso, você pode procurar versões recentes do fmt e copiar uma de lá.