C のクラス メンバー変数の存在の確認
この質問は、特定のメンバー変数、つまり "x" の存在を判断する方法を求めています。または、テンプレート引数として機能するクラス内の「X」。この手法は、それぞれが個別の "x" メンバーを使用する MFC CPoint や GDI PointF などのクラスを操作する場合に特に役立ちます。
提案されたソリューション
応答は次のように提案します2 つの解決策:
1.マクロベースのソリューション:
このアプローチは、Visual Studio のプリプロセッサ マクロの使用に依存しています:
template<class P> bool Check_x(P p, typename TT<sizeof(&P::x)>::type b = 0) { return true; } template<class P> bool Check_x(P p, typename TT<sizeof(&P::X)>::type b = 0) { return false; }
ただし、このソリューションは Visual Studio に限定されており、GNU C ではコンパイルされません。
2. C 11 ベースのソリューション:
このソリューションは C 11 の型特性を利用します:
#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 { };
この手法は、SFINAE (置換失敗はエラーではありません) を使用してメンバーをチェックすることで機能します。変数。メンバー変数が存在する場合、対応する型のテンプレート特殊化が呼び出され、true の戻り値が返されます。それ以外の場合は、デフォルトのテンプレートが選択され、 false の戻り値が返されます。
以上がC テンプレート クラスにメンバー変数 'x' または 'X' が存在するかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。