Не большая разница, но альтернативой ответу Юлиуса может быть использование одной и той же проверки (std::bool_constant<(... || std::is_same<T, Ts>{})
или, лучше, std::disjunction<std::is_same<T, Ts>...>
) одним и тем же путем объявления функции constexpr
и шаблона constexpr
переменная
template <typename T, template <typename...> class C, typename ... Ts>
constexpr auto isTypeInList (C<Ts...> const &)
-> std::disjunction<std::is_same<T, Ts>...>;
template <typename T, typename V>
static constexpr bool isTypeInList_v
= decltype(isTypeInList<T>(std::declval<V>()))::value;
и вы можете использовать их следующим образом
using MyVt = std::variant<int, float>;
static_assert( isTypeInList_v<int, MyVt> );
static_assert( isTypeInList_v<double, MyVt> == false );
Не большое улучшение, но ... если вы также определите (не только объявите) функцию isTypeInList()
template <typename T, template <typename...> class C, typename ... Ts>
constexpr auto isTypeInList (C<Ts...> const &)
-> std::disjunction<std::is_same<T, Ts>...>
{ return {}; }
вы также можете использовать его непосредственно для проверки объектов
MyVt myVar {0};
static_assert( isTypeInList<int>(myVar) );
, избегая необходимости проходить через decltype()
MyVt myVar {0};
static_assert( isTypeInList_v<int, decltype(myVar)> );