ホームページ > バックエンド開発 > C++ > C クラスに特定のシグネチャを持つメンバー関数があるかどうかを確認するにはどうすればよいですか?

C クラスに特定のシグネチャを持つメンバー関数があるかどうかを確認するにはどうすればよいですか?

DDD
リリース: 2024-12-30 08:55:09
オリジナル
345 人が閲覧しました

How Can I Check if a C   Class Has a Member Function with a Specific Signature?

カスタム シグネチャによるメンバー関数の存在の確認

この記事では、C クラスが特定のメンバー関数を所有しているかどうかを判断するという課題に取り組みます。指定された署名付き。 Scott Meyers の本で議論されている問題とは異なり、ここでの目標は、関数を持っているクラスと欠けているクラスを区別することです。

テンプレート トリック

これを達成するために、以下を導入します。 C 11 の機能を活用したテンプレートのトリック。 has_serialize テンプレート構造はプライマリ テンプレートとして機能し、2 番目のテンプレート パラメーターが関数型である必要があることをアサートします。

関数検証の特殊化

has_serialize テンプレートの特殊化実際の機能検証を行います。これは 2 つのテンプレート関数を使用します。

  • check: ダミー オブジェクトで指定されたメソッドの呼び出しを試み、戻り値の型を期待される型と比較してチェックします。
  • type: 戻り値の型が正しいかどうかを決定します。チェック関数の型が期待される型と一致します。

関数検証

クラス C の署名 Ret(Args...) を持つ特定の関数 f(Args...) の存在をテストするには:

std::cout << has_serialize<C, Ret(Args...)>::value << endl;
ログイン後にコピー

使用例

次の例では、2 つのクラス X と Y を定義します。ここで、Y は X から継承します。クラス X には、int を返すメンバー関数 Serialize(const std::string&) があります。

has_serialize テンプレートを使用すると、X と Y の両方が 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 << endl; // 1 (true)
std::cout << has_serialize<Y, int(const std::string&amp;)>::value << endl; // 1 (true)
ログイン後にコピー

これは、has_serialize テンプレート トリックがクラスに特定のメンバー関数が含まれているかどうかを効果的に検出する方法を示しています。署名。

以上がC クラスに特定のシグネチャを持つメンバー関数があるかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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