カスタム シグネチャによるメンバー関数の存在の確認
この記事では、C クラスが特定のメンバー関数を所有しているかどうかを判断するという課題に取り組みます。指定された署名付き。 Scott Meyers の本で議論されている問題とは異なり、ここでの目標は、関数を持っているクラスと欠けているクラスを区別することです。
テンプレート トリック
これを達成するために、以下を導入します。 C 11 の機能を活用したテンプレートのトリック。 has_serialize テンプレート構造はプライマリ テンプレートとして機能し、2 番目のテンプレート パラメーターが関数型である必要があることをアサートします。
関数検証の特殊化
has_serialize テンプレートの特殊化実際の機能検証を行います。これは 2 つのテンプレート関数を使用します。
関数検証
クラス 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&) { return 42; } }; struct Y : X {}; std::cout << has_serialize<X, int(const std::string&)>::value << endl; // 1 (true) std::cout << has_serialize<Y, int(const std::string&)>::value << endl; // 1 (true)
これは、has_serialize テンプレート トリックがクラスに特定のメンバー関数が含まれているかどうかを効果的に検出する方法を示しています。署名。
以上がC クラスに特定のシグネチャを持つメンバー関数があるかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。