SFINAE:使用模板结构的子模板

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

做这些事情的正确方法是什么?

我想在参数包上使用条件,例如:

static_assert(all_of<ChildTypes ...>::are_in<ParentTypes ...>::value);

简而言之,我有这样的代码:

template <class ... Types> struct is_in
{
    template <class Arg>
    struct test : any_of<Types ...>::is_same_as<Arg> {}; // error C2059
};

template <class ... Args>
struct all_of
{
    template <class ... Types>
    struct are_in : all_fulfill<typename is_in<Types ...>::test, Args ...> {};

    template <class Type>
    struct are : all_fulfill<typename is_same_as<Type>::test, Args ...> {};
};

any_of<Types...>::is_same_as<Type>::value
all_of<Types...>::are<Type>::value
在函数中使用时效果很好,所以
all_fulfill
和 `any_fulfills' 也很好用(总是 true_type 或 false_type)。

尝试调用 are_in 时出现以下错误:

error C2059: syntax error: '<'
error C2039: 'value': is not a member of 'is_in<bool,int>::test<Head>' with [ Head=int ]
error C2065: 'value': undeclared identifier
error C2975: '_Test': invalid template argument for 'std::conditional', expected compile-time constant expression

作为背景:

template < template <class> typename Test, typename... List >
struct all_fulfill : std::false_type {};

template < template <class> typename Test, typename Head, typename... List >
struct all_fulfill<Test, Head, List ...>
    : std::conditional< Test<Head>::value, // error C2065 // error C2975
    all_fulfill<Test, List...>, // error C2039
    std::false_type
    >::type {};

template < template <class> typename Test >
struct all_fulfill<Test> : std::true_type {};

试过:

struct is_in
中为父类型添加别名,例如:
using AnyOfTypes = any_of<Types ...>;
struct AnyOfTypes : any_of<Types ...> {}

预期结果:

any_of<Types...>::is_same_as<Type>::value
应该返回正确的 bool.

c++ templates sfinae
© www.soinside.com 2019 - 2024. All rights reserved.