50template <
template <
typename...>
class Tuple,
typename... Types,
size_t... Idx>
60template <
typename T,
typename U>
62operator<<(std::ostream&,
const std::pair<T, U>&);
64template <
typename... Types>
66operator<<(std::ostream&,
const std::tuple<Types...>&);
68template <
typename Tp,
typename... Extra>
70operator<<(std::ostream&,
const std::vector<Tp, Extra...>&);
72template <
typename Tp,
size_t N>
74operator<<(std::ostream&,
const std::array<Tp, N>&);
78template <
typename T,
typename U>
82 os <<
"(" << p.first <<
"," << p.second <<
")";
86template <
typename... Types>
88operator<<(std::ostream&
os,
const std::tuple<Types...>& p)
90 constexpr size_t N =
sizeof...(Types);
95template <
typename Tp,
typename... ExtraT>
97operator<<(std::ostream&
os,
const std::vector<Tp, ExtraT...>& p)
100 for(
size_t i = 0; i < p.size(); ++i)
101 os << p.at(i) << ((i + 1 < p.size()) ?
"," :
"");
106template <
typename Tp,
size_t N>
111 for(
size_t i = 0; i < p.size(); ++i)
112 os << p.at(i) << ((i + 1 < p.size()) ?
"," :
"");
117template <
template <
typename...>
class Tuple,
typename... Types,
size_t... Idx>
122 constexpr size_t N =
sizeof...(Types);
the namespace provides overloads to output complex data types w/ streams
void tuple_printer(const Tuple< Types... > &obj, std::ostream &os, index_sequence< Idx... >)
std::ostream & operator<<(std::ostream &, const std::pair< T, U > &)
std::make_integer_sequence< size_t, Num > make_index_sequence
Alias template make_index_sequence.
const std::string std::ostream * os
std::integer_sequence< size_t, Idx... > index_sequence
Alias template index_sequence.
#define TIMEMORY_FOLD_EXPRESSION(...)