[英]How to create C++20 concept for typelist predicate?
我开始学习C ++ 20的概念。 我想为typelist的过滤谓词创建一个concept
。
假设有一个如下定义的类型列表:
template <typename ...TYPE>
struct List {
};
还有Filter
,它可以根据谓词过滤类型列表。 可能的定义是这样的:
template <template <typename> typename PREDICATE, typename LIST>
struct Filter {
using result = List<...>; // some implementation here
};
这意味着,对于每个LIST
的TYPE
参数,必须评估PREDICATE<TYPE>::value
(它是bool
值),如果是true
,则Filter::result
必须包含TYPE
。
现在,我如何为PREDICATE
创建一个concept
,因此Filter
只接受它,如果它包含一个value
成员(对于所有TYPE
,它在LIST
)?
我的意思是,对于这个MyPredicate
, concept
应该只允许使用LIST
实例化Filter
,除了some_type1
和some_type2
之外没有其他类型:
template <typename TYPE>
struct MyPredicate;
template <>
struct MyPredicate<some_type1> {
static constexpr bool value = true;
};
template <>
struct MyPredicate<some_type2> {
static constexpr bool value = false;
};
Filter<MyPredicate, List<some_type1, some_type2>>::result x; // here, x should have the type List<some_type1>
Filter<MyPredicate, List<int>>::result y; // should not compile, as MyPredicate<int> isn't defined
您有一个检查单个实例的概念:
template <typename T>
concept nested_value = std::same_as<decltype(T::value), bool>;
您可以在fold-expression中使用哪个:
template <template <typename> class Pred, typename List>
struct Filter;
template <template <typename> class Pred, template <typename...> class L, typename... Ts>
requires (nested_value<Pred<Ts>> && ... )
struct Filter<Pred, L<Ts...>> {
// ...
};
或者你基本上可以在一个概念中做同样的事情:
template <template <typename> class Pred, typename List>
struct all_nested_impl : std::false_type { };
template <template <typename> class Pred, template <typename...> class L, typename... Ts>
struct all_nested_impl<Pred, L<Ts...>>
: std::bool_constant<(nested_value<Pred<Ts>> && ...)>
{ };
template <template <typename> class Pred, typename List>
concept all_nested = all_nested_impl<Pred, List>::value;
template <template <typename> class Pred, typename List>
requires all_nested<Pred, List>
struct Filter;
或者如果你只是翻转参数,你就可以写:
template <template <typename> class Pred, all_nested<Pred> List>
struct Filter;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.