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_
です。任意の数の型を受け入れるジェネリック クラスがあります。最初の特殊化は、パックの最初の引数をチェックします。それが false の場合、全体and_
が false になるため、続行する必要はありません。true の場合は、残りのパラメーターのチェックを続けます。パラメータがなくなると、パラメータのない特殊化は単純に true を返します。
次に例を示します。
and_<t, t, f, t>::value
gives conditional<t::value, and_<t, f, t>, f>::type
条件が true であるためtype
、2 番目のパラメーターに評価されますand_<t, f, t>
。次のパラメーターについても同様に、次のようになります。
and_<f, t>::value
gives conditional<f::value, and_<t>, f>::type
これで条件が falsetype
になり、3 番目のパラメーターに評価され、f
テンプレートのインスタンス化が完了し、::value
が得られfalse
ます。
すべてのパラメータが true の場合、最終的にand_<>
は、特化したものに到達するstd::true_type
ため、 が::value
得られtrue
ます。
このコードがどのように機能するかを明確にするのに役立つことを願っています。