只需像这样编写一个and_
元函数:
template <class ... Bools>
struct and_;
template <class Bool, class ... Bools>
struct and_<Bool, Bools...> : std::conditional<
Bool::value, and_<Bools...>, std::false_type>::type{};
template <>
struct and_<> : std::true_type{};
我还没有测试过这个,所以可能会有几个打字错误,但我希望你能理解。
然后你可以像这样使用它:
typedef and_<typename ArgResolver<Args>::IsResolvable...> IsSignatureRecognized
它的工作方式非常简单,我们有一个通用类
template <class...> and_
,它接受任意数量的类型。第一个特化检查包中的第一个参数,如果为假,则无需继续,因为整个
and_
将为假。如果为真,则继续检查其余的参数。一旦没有剩余参数,没有参数的特化就会简单地返回true。
这是一个例子:
and_<t, t, f, t>::value
gives conditional<t::value, and_<t, f, t>, f>::type
因为条件为真,type
评估为第二个参数 and_<t,f,t>
。类似地,对于下一个参数,我们得到:
and_<f, t>::value
gives conditional<f::value, and_<t>, f>::type
现在条件为假,因此
type
评估为第三个参数
f
,我们完成模板实例化,
::value
给出
false
。
如果所有参数都为真,则最终会到达
and_<>
,我们将其专门设置为
std::true_type
,以便
::value
给出
true
。
希望这有助于澄清此代码的工作原理。