指定されたシグネチャのクラス メンバー関数の確認
クラスが事前に定義されたシグネチャの特定のメンバー関数を所有しているかどうかを検証するという課題を考えてみましょう。サイン。 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&) { return 42; } }; std::cout << has_serialize<Y, int(const std::string&)>::value; // prints 1
以上が私のクラスにはこのメンバー機能がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。