コード開発では、クラス内の特定のメンバー変数の存在を確認することが必要になることがよくあります。この情報は、異なるメンバー名を持つさまざまなクラスで動作する汎用アルゴリズム テンプレート関数を作成する場合に特に役立ちます。
クラスをテンプレート引数として指定すると、目的は、クラスが次のとおりであるかどうかを確認することです。 「x」または「X」(またはそれらの大文字の相当物) で示される特定のメンバー変数を所有します。この機能により、MFC の CPoint クラスや GDI の PointF クラスなど、さまざまな座標系を処理する汎用アルゴリズムの作成が容易になります。
この問題に対処するには、次のようなテンプレートを実装できます。クラスをテンプレート引数として受け入れ、必要なメンバー変数の存在を確認します。 sizeof 演算子と型特性を活用することで、メンバー変数「x」と「X」の存在を区別することができます。
実装例は次のとおりです。
template<int> struct TT { typedef int type; }; 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; }
このテンプレートは機能します。 &P::x と &P::X のサイズを比較して、どのメンバー変数が存在するかを判断します。 &P::x が存在する場合、テンプレートは true を返します。それ以外の場合は、 false を返します。
提案されたソリューションは、Visual Studio と GNU C の両方と互換性があります。ただし、より汎用的なアプローチの場合は、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 { };
このソリューションは、decltype および std::false_type 型特性を利用して、指定されたクラス内の x の存在を検出します。 。 T に x メンバー変数がある場合、HasX
HasX テンプレートの使用法を示すには、次のようにします。
struct A { int x; }; struct B { int y; }; int main() { std::cout << std::boolalpha << HasX<A>::value << std::endl; // true std::cout << std::boolalpha << HasX<B>::value << std::endl; // false return 0; }