测试std :: common_type是否存在

时间:2017-03-12 13:49:23

标签: c++ templates variadic-templates

我想编写一个辅助模板来检查模板参数包是否具有公共类型,即,如果将std::common_type应用于包定义了类型。

在SFINAE中使用std::void_t我提出了以下定义:

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
{ };

然而,这不起作用,因为模板参数包必须是最后一个参数。编译器引发以下错误:

error: template parameter pack must be the last template parameter
                        template<typename... Types, typename Enable = void>

如何定义这样的模板?

1 个答案:

答案 0 :(得分:7)

选项#1

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

{{1}}

DEMO 2