如何在 C++20 中定义一个概念来检查类型是否与类型列表中的任何类型匹配

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

我想用C++定义一个概念(<= C++20) to check if a type matches any of the types define in a type-list struct.

以下是我迄今为止的尝试:

template<typename... Types>
struct TypeList {};

using SupportedTypes = TypeList<int, bool, float, long>;
    
template<typename T, typename... Types>
concept IsAnyOf = (std::is_same_v<T, Types> || ...);
    
static_assert(IsAnyOf<bool, SupportedTypes>);

我也尝试过使用:

template<typename T, typename... Types>
concept IsAnyOf = std::disjunction_v<std::is_same<T, Types>...>;

但是我的静态断言失败了:

Static assertion failed
because 'IsSupportedType<_Bool, SupportedTypes>' evaluated to false
because 'std::is_same_v<_Bool, meta::TypeList<int, _Bool, float, long> >' evaluated to false

我理解这可能与我将

SupportedTypes
传递给概念而没有正确解压其中的类型有关,因此在静态断言中我检查 bool 是否与
SupportedTypes
相同,而不是检查 bool 是否与
SupportedTypes
中的任何类型相同;但我仍然无法让它工作。

非常感谢任何帮助。

c++ variadic-templates template-meta-programming c++-concepts argument-unpacking
1个回答
0
投票

如何在 C++20 中定义一个概念来检查类型是否与类型列表中的任何类型匹配

您可以使用现有的

std::tuple
std::index_sequence
来简化此操作,如下所示:

template <typename T, typename Typelist>
concept is_any_of = []<std::size_t... Indices>(std::index_sequence<Indices...>) 
{
   return (std::is_same_v<std::tuple_element_t<Indices, Typelist>, T> || ...);
}(std::make_index_sequence<std::tuple_size_v<Typelist>>());

工作演示


这就是你将如何使用它:

using typelist = std::tuple<double, float, std::string, bool>;

int main() {
  
  std::cout << is_any_of<bool, typelist>; //true
  std::cout << is_any_of<char, typelist>; //false
}
© www.soinside.com 2019 - 2024. All rights reserved.