如何泛化任何可变参数模板类型的模板专业化?

问题描述 投票:0回答:1

我有以下类型函数来计算某些类型

T
是否是
std::tuple
中类型列表的一部分:

template<typename T, typename Tuple>
struct IsInTuple;

template<typename T, typename ...Ts>
struct IsInTuple<T, std::tuple<Ts...>>
{
  static constexpr bool value = std::disjunction_v<std::is_same<T, Ts>...>;
};

我的问题是,是否可以将此函数推广到任何采用可变参数类型列表的可变参数模板类型,以便它不仅适用于

std::tuple
,还适用于
std::variant

c++ templates c++17 variadic-templates type-traits
1个回答
8
投票

是否可以将此函数推广到任何采用可变参数类型列表的可变参数模板类型,以便它不仅适用于

std::tuple
s,而且还适用于
std::variant
s?

是的,可以。只需使用 template 模板参数 来泛化类型特征。

template<typename T, typename Class> struct IsInTypeList;

template<typename T
       , template<typename...> class Class, typename... Ts>
struct IsInTypeList<T, Class<Ts...>>
{
    static constexpr bool value = (std::is_same_v<T, Ts> || ...);
                            // or std::disjunction_v<std::is_same<T, Ts>...>;
};

// Example usage
static_assert(IsInTypeList<int, std::tuple<int, float, double>>::value, "int is not in the tuple");
static_assert(!IsInTypeList<char, std::tuple<int, float, double>>::value, "char is in the tuple");
static_assert(!IsInTypeList<char, std::variant<int, float, double>>::value, "char is in the variant");

观看现场演示

© www.soinside.com 2019 - 2024. All rights reserved.