117 PrintInternal(stream);
121 template <
typename...>
124 template <
typename Type,
typename =
void>
125 struct has_begin : std::false_type
128 template <
typename Type>
129 struct has_begin<Type, void_t<decltype(std::declval<Type>().begin())>> : std::true_type
132 template <
typename Type,
typename =
void>
133 struct has_cbegin : std::false_type
136 template <
typename Type>
137 struct has_cbegin<Type, void_t<decltype(std::declval<Type>().cbegin())>> : std::true_type
140 template <
typename Type = BaseType>
141 std::enable_if_t<has_begin<Type>::value && !has_cbegin<Type>::value,
void> PrintInternal(
CommaSeperatedStream& stream)
const
143 std::for_each(
static_cast<const BaseType*
>(
this)->begin(),
static_cast<const BaseType*
>(
this)->end(), [&](
auto elem) {
148 template <
typename Type = BaseType>
149 std::enable_if_t<has_cbegin<Type>::value,
void> PrintInternal(
CommaSeperatedStream& stream)
const
151 std::for_each(
static_cast<const BaseType*
>(
this)->cbegin(),
static_cast<const BaseType*
>(
this)->cend(), [&](
auto elem) {