I want to write a helper template that checks if a template parameter pack has a common type, i.e., if applying std::common_type
to the pack defines a type.
Using std::void_t with SFINAE I came up with the following definition:
template<typename... Types, typename Enable = void>
struct has_common_type : std::false_type
{ };
template<typename... Types>
struct has_common_type<Types..., std::void_t<std::common_type<Types...>::type>> : std::true_type
{ };
This however does not work, because the template parameter pack must be the last parameter. The compiler raises the following error:
error: template parameter pack must be the last template parameter
template<typename... Types, typename Enable = void>
How can one go about defining such a template?
template <typename... Ts>
using has_common_type = std::experimental::is_detected<std::common_type_t, Ts...>;
DEMO
template <typename AlwaysVoid, typename... Ts>
struct has_common_type_impl : std::false_type {};
template <typename... Ts>
struct has_common_type_impl<std::void_t<std::common_type_t<Ts...>>, Ts...> : std::true_type {};
template <typename... Ts>
using has_common_type = typename has_common_type_impl<void, Ts...>::type;
DEMO 2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With