-template <class T>
-using IsSplitTargetType = std::integral_constant<bool,
- std::is_arithmetic<T>::value ||
- std::is_same<T, StringPiece>::value>;
-
-template<bool exact = true,
- class Delim,
- class OutputType,
- class... OutputTypes>
-typename std::enable_if<IsSplitTargetType<OutputType>::value, bool>::type
-split(const Delim& delimiter,
- StringPiece input,
- OutputType& outHead,
- OutputTypes&... outTail);
+namespace detail {
+template <typename Void, typename OutputType>
+struct IsConvertible : std::false_type {};
+
+template <typename OutputType>
+struct IsConvertible<
+ void_t<decltype(parseTo(StringPiece{}, std::declval<OutputType&>()))>,
+ OutputType> : std::true_type {};
+} // namespace detail
+template <typename OutputType>
+struct IsConvertible : detail::IsConvertible<void, OutputType> {};
+
+template <bool exact = true, class Delim, class... OutputTypes>
+typename std::enable_if<
+ StrictConjunction<IsConvertible<OutputTypes>...>::value &&
+ sizeof...(OutputTypes) >= 1,
+ bool>::type
+split(const Delim& delimiter, StringPiece input, OutputTypes&... outputs);