C 11 を使用して特定のシグネチャを持つメンバー関数の存在を確認する
C では、開発者はクラスが次の署名を持っているかどうかを検証する必要があることがよくあります。特定のシグネチャを持つメンバー関数。参照ドキュメントでは直接取り上げられていませんが、この記事では、この要件を満たすテンプレートベースのソリューションを紹介します。
提案された手法は C 11 の機能に依存しており、継承された関数であっても精度を保証します。このメソッドは、「serialize」という名前の関数の存在のテストを中心に展開します。
関数検出のためのテンプレートの特殊化
ソリューションの核心は、次の特殊化にあります。 「has_serialize」という名前のテンプレート。このテンプレートのパラメータは、「Ret(Args...)」として表されるクラスと関数シグネチャです。特殊化は、クラスのインスタンスで「serialize」関数の呼び出しを試行し、戻り値の型が指定された署名と一致するかどうかを確認します。
関数が存在し、その戻り値の型が指定された署名と一致する場合、「has_serialize」 " テンプレートの特殊化は true を返します。それ以外の場合は、false を返します。
使用例
このソリューションの使用法を説明するために、次のコードを考えてみましょう。
struct X { int serialize(const std::string&); }; struct Y : X {}; std::cout << has_serialize<Y, int(const std::string&)>::value; // will print 1
この中でたとえば、「has_serialize」テンプレートは、「Y」クラスが文字列を引数として受け取る「serialize」関数を持っているかどうかを判断するために使用されます。そして整数を返します。 「Y」はこの関数を「X」から継承しているため、結果は true になり、出力は 1.
になります。以上が私のクラスには特定の「serialize」メンバー関数がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。