3

typedef次の C++式が与えられた場合

template <bool> struct BoolType : std::true_type {};

template <> struct BoolType< false > : std::false_type {};

typedef BoolType< ArgResolver< Arg1 >::IsResolvable::value && ArgResolver< Arg2 >::IsResolvable::value > IsSignatureRecognized;

可変個引数テンプレートを使用して実行できるかどうかを自問していました。コードはHypodermic IoC コンテナーから取得されます。&&それぞれの間のチェックを保持しながら、どうすればそれらを解凍できますか?

4

2 に答える 2

4

C++17 では、次のことができます。

using IsSignatureRecognized = BoolType<(ArgResolver<Args>::IsResolvable::value && ...)>;

以前は、可変引数 ' and' を自分で作成する必要がありました。

于 2015-12-08T16:22:48.520 に答える
3

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ます。

このコードがどのように機能するかを明確にするのに役立つことを願っています。

于 2015-12-08T16:13:20.557 に答える