メタプログラミングを使用したメンバー変数の検出
質問:
クラスかどうかをどのように判断できますか?名前が不明な場合や、異なる名前を使用している場合でも、特定のメンバー変数が含まれています。 class?
解決策:
1 つのアプローチにはメタプログラミング手法が含まれ、decltype 演算子と SFINAE (置換失敗はエラーではない) を利用します。次のコードを考えてみましょう:
#include <type_traits> template <typename T, typename = int> struct HasX : std::false_type { }; template <typename T> struct HasX<T, decltype((void) T::x, 0)> : std::true_type { };
説明:
使用法:
この手法を使用するには、テンプレートを次のように宣言します:
template <typename T> bool Check_x(T p, typename HasX<T>::type b = 0) { return true; }
このチェックは、x メンバー変数を持つクラスに対して true を返します。として:
struct P1 { int x; };
、そうでない場合は false (例:
struct P2 { float X; };
注:
このソリューションでは C 11 機能の使用を回避します) std::is_member_function_pointer など、古いコンパイラとの互換性を維持します。
以上がメタプログラミングは C クラス内のメンバー変数の存在をどのように検出できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。