ホームページ > バックエンド開発 > C++ > C クラス内の特定のメンバー変数の存在を検出するにはどうすればよいですか?

C クラス内の特定のメンバー変数の存在を検出するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-14 18:52:16
オリジナル
654 人が閲覧しました

How Can I Detect the Presence of Specific Member Variables in C   Classes?

C クラスのメンバー変数の検出

コード開発では、クラス内の特定のメンバー変数の存在を確認することが必要になることがよくあります。この情報は、異なるメンバー名を持つさまざまなクラスで動作する汎用アルゴリズム テンプレート関数を作成する場合に特に役立ちます。

問題ステートメント

クラスをテンプレート引数として指定すると、目的は、クラスが次のとおりであるかどうかを確認することです。 「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 true と評価されます。それ以外の場合は、false と評価されます。

使用例

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;
}
ログイン後にコピー

このコードは、HasX に対して true を出力します。 HasX の場合は false で、A には x が存在し、B には x が存在しないことを正しく示します。

以上がC クラス内の特定のメンバー変数の存在を検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート