118 PrintInternal(stream);
122 template <
typename...>
125 template <
typename Type,
typename =
void>
126 struct has_begin : std::false_type
129 template <
typename Type>
130 struct has_begin<Type, void_t<decltype(std::declval<Type>().begin())>> : std::true_type
133 template <
typename Type,
typename =
void>
134 struct has_cbegin : std::false_type
137 template <
typename Type>
138 struct has_cbegin<Type, void_t<decltype(std::declval<Type>().cbegin())>> : std::true_type
141 template <
typename Type = BaseType>
142 std::enable_if_t<has_begin<Type>::value && !has_cbegin<Type>::value,
void> PrintInternal(
CommaSeperatedStream& stream)
const
144 std::for_each(
static_cast<const BaseType*
>(
this)->begin(),
static_cast<const BaseType*
>(
this)->end(), [&](
auto elem) {
149 template <
typename Type = BaseType>
150 std::enable_if_t<has_cbegin<Type>::value,
void> PrintInternal(
CommaSeperatedStream& stream)
const
152 std::for_each(
static_cast<const BaseType*
>(
this)->cbegin(),
static_cast<const BaseType*
>(
this)->cend(), [&](
auto elem) {