ホームページ > バックエンド開発 > C++ > C 11 の型特性は、特定のシグネチャを持つメンバー関数の存在をどのように検出できますか?

C 11 の型特性は、特定のシグネチャを持つメンバー関数の存在をどのように検出できますか?

Mary-Kate Olsen
リリース: 2024-12-26 22:59:10
オリジナル
940 人が閲覧しました

How Can C  11 Type Traits Detect the Presence of a Member Function with a Specific Signature?

C 11 の型特性を使用したメンバー関数の存在の検出

質問:

どうすればよいですかクラスが提供することを要求せずに、クラスが特定のシグネチャを持つメンバー関数を所有しているかどうかを判断します。

ジレンマの詳細:

問題は、クラス内の特定のメンバー関数の有無に基づいてカスタム操作を実行する必要がある場合に発生します。クラスが関数を提供しなければならない場合とは異なり、条件付き処理のためにその存在を識別する方法を模索します。理想的なソリューションは、グローバル関数の上書き、過剰なスタック呼び出し、侵入的な名前空間宣言を回避します。

テンプレートベースのソリューション:

C 11 の型特性を利用して、ターゲットの存在を検証するテンプレート関数function:

template<typename C, typename Ret, typename... Args>
struct has_serialize {
    // Assertion to prevent instantiation with non-function arguments
    static_assert(
        std::integral_constant<T, false>::value,
        "Second template parameter needs to be of function type."
    );

    // Specialization to perform the check
    private:
        template<typename T>
        static constexpr auto check(T*)
        -> typename
            std::is_same<
                decltype( std::declval<T>().serialize( std::declval<Args>()... ) ),
                Ret    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            >::type;  // attempt to call it and see if the return type is correct

        template<typename>
        static constexpr std::false_type check(...);

        typedef decltype(check<C>(0)) type;

    public:
        static constexpr bool value = type::value;
};
ログイン後にコピー

Usage:

has_serialize テンプレートを使用してクラス内の関数の存在を確認できるようになりました:

struct X {
    int serialize(const std::string&amp;) { return 42; } 
};

struct Y : X {};

std::cout << has_serialize<X, int(const std::string&amp;)>::value; // prints 1
ログイン後にコピー

上の例では、 has_serialize

以上がC 11 の型特性は、特定のシグネチャを持つメンバー関数の存在をどのように検出できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート