我想用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++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
}