做这些事情的正确方法是什么?
我想在参数包上使用条件,例如:
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.