クラス内の特定のメンバー変数の存在の検出
コードでは、クラス内の特定のメンバー変数の存在を確認できます。挑戦的。これは、汎用アルゴリズムを実装する場合、またはさまざまなメンバー名を持つクラスを操作する場合に重要です。
問題ステートメント:
提供されたコードは、クラス テンプレート引数に "x" (または "X") および "y" (または "Y") が存在します。これは、メンバー変数名が異なる MFC の CPoint や GDI の PointF のようなクラスで特に便利です。
元のソリューションでは、「x」と「X」に異なるテンプレート関数を使用していました。ただし、これにより、Visual Studio でコンパイルの問題が発生しました。
ユニバーサル ソリューション:
ユニバーサル ソリューションを実現するには、SFINAE (置換失敗はエラーではない) を利用できます。 。以下の変更されたコードは、このアプローチを示しています。
template <typename T> struct HasX : std::false_type { }; template <typename T> struct HasX<T, decltype((void)T::x, 0)> : std::true_type { };
このコードは、「decltype(...)」の「T::x」を置換しようとすることで SFINAE を悪用します。 「T::x」が有効な場合、HasX
このソリューションは C 11 に限定されず、任意のクラスのメンバー変数を検出するための汎用メソッドを提供します。
以上がC クラス内の特定のメンバー変数の存在を確実に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。