做这种事的正确方法是什么?
我想在参数包上使用如下条件:
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 ...> {}
预期结果:all_of<ChildTypes ...>::are_in<ParentTypes ...>::value
应返回正确的bool。
1条答案
按热度按时间6g8kf2rb1#
这个怎么样?
https://godbolt.org/z/Y1j7dedsh