ホームページ >バックエンド開発 >C++ >私のクラスにはこのメンバー機能がありますか?

私のクラスにはこのメンバー機能がありますか?

DDD
DDDオリジナル
2024-12-21 08:20:11470ブラウズ

Does My Class Have This Member Function?

指定されたシグネチャのクラス メンバー関数の確認

クラスが事前に定義されたシグネチャの特定のメンバー関数を所有しているかどうかを検証するという課題を考えてみましょう。サイン。 Scott Meyers の Effects C 第 3 版で説明されている概念に関連していますが、この問題には明確な解決策が必要です。

問題と要件

Meyers のシナリオとは異なり、メンバー関数の存在はコンパイルに不可欠であり、この状況では柔軟なアプローチが必要です。目的は、目的のメンバー関数を実装するクラスと実装していないクラスを区別し、それに応じてさまざまなアクションをトリガーすることです。

テンプレート ソリューション

C 11 はテンプレートを提供します。メンバー関数 (継承されたものであっても) を効果的に検出するベースのソリューション。提供された実装は、戻り値の型の互換性をチェックするために is_same トレイトに依存しています:

#include <type_traits>

// Check member function presence and return type correctness
template<typename C, typename Ret, typename... Args>
struct has_serialize {
    static constexpr bool value =
        std::is_same<
            decltype( std::declval<T>().serialize( std::declval<Args>()... ) ),
            Ret
        >::type::value;
};

Usage

このアプローチを利用するには、チェックするクラスを指定するだけです。メンバー関数の戻り値の型と引数:

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

std::cout << has_serialize<Y, int(const std::string&amp;)>::value; // prints 1

以上が私のクラスにはこのメンバー機能がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。