繁体   English   中英

如何为typelist谓词创建C ++ 20概念?

[英]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
};

这意味着,对于每个LISTTYPE参数,必须评估PREDICATE<TYPE>::value (它是bool值),如果是true ,则Filter::result必须包含TYPE

现在,我如何为PREDICATE创建一个concept ,因此Filter只接受它,如果它包含一个value成员(对于所有TYPE ,它在LIST )?

我的意思是,对于这个MyPredicateconcept应该只允许使用LIST实例化Filter ,除了some_type1some_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM