ホームページ > バックエンド開発 > C++ > C テンプレート クラスにメンバー変数 'x' または 'X' が存在するかどうかを確認するにはどうすればよいですか?

C テンプレート クラスにメンバー変数 'x' または 'X' が存在するかどうかを確認するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-25 08:25:12
オリジナル
382 人が閲覧しました

How Can I Check for the Existence of Member Variables

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 サイトの他の関連記事を参照してください。

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