C 11 の型特性を使用したメンバー関数の存在の検出
質問:
どうすればよいですかクラスが提供することを要求せずに、クラスが特定のシグネチャを持つメンバー関数を所有しているかどうかを判断します。
ジレンマの詳細:
問題は、クラス内の特定のメンバー関数の有無に基づいてカスタム操作を実行する必要がある場合に発生します。クラスが関数を提供しなければならない場合とは異なり、条件付き処理のためにその存在を識別する方法を模索します。理想的なソリューションは、グローバル関数の上書き、過剰なスタック呼び出し、侵入的な名前空間宣言を回避します。
テンプレートベースのソリューション:
C 11 の型特性を利用して、ターゲットの存在を検証するテンプレート関数function:
template<typename C, typename Ret, typename... Args> struct has_serialize { // Assertion to prevent instantiation with non-function arguments static_assert( std::integral_constant<T, false>::value, "Second template parameter needs to be of function type." ); // Specialization to perform the check private: template<typename T> static constexpr auto check(T*) -> typename std::is_same< decltype( std::declval<T>().serialize( std::declval<Args>()... ) ), Ret // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >::type; // attempt to call it and see if the return type is correct template<typename> static constexpr std::false_type check(...); typedef decltype(check<C>(0)) type; public: static constexpr bool value = type::value; };
Usage:
has_serialize テンプレートを使用してクラス内の関数の存在を確認できるようになりました:
struct X { int serialize(const std::string&) { return 42; } }; struct Y : X {}; std::cout << has_serialize<X, int(const std::string&)>::value; // prints 1
上の例では、 has_serialize
以上がC 11 の型特性は、特定のシグネチャを持つメンバー関数の存在をどのように検出できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。