コンテキストで「this」の使用が許可されているかどうかを判断する方法はありますか?
私の目標は、コンテキストに応じて「this」を使用するロギング用の汎用マクロを作成することです(たとえば、「this」の値を出力する場合)。
コンテキストで「this」の使用が許可されているかどうかを判断する方法はありますか?
私の目標は、コンテキストに応じて「this」を使用するロギング用の汎用マクロを作成することです(たとえば、「this」の値を出力する場合)。
これができたとしても、それを使用することはできません。コードは、呼び出されない場合でも合法である必要がありthis
、そのようなコンテキストで言及することは合法ではありません。検討:
if (this_is_legal())
std::cout << this << std::endl;
else
std::cout << "not in member function" << std::endl;
this_is_legal
魔法が働いたとしても、このコードはコンパイルされません。最初の行は、正当でないstd::cout
コンテキストではコンパイルされないためです。this
const void *getThis() { return NULL; }
グローバル関数およびconst void *getThis() { return this; }
メンバー関数として非常に醜いことを行うことができます。NULL
これにより、またはを返す関数が得られますthis
。未定義の動作に依存して、this
メンバー変数のない基本クラスでポインターが変更されないことを期待する必要があります。
デバッグ目的で基本クラスを定義する余裕がある場合は、グローバルおよびクラス メンバーdebug
関数を定義します。メンバー関数は使用できますthis
が、グローバル関数は他の情報を使用でき、スコープ規則は正しいdebug
関数を選択できます。
もう 1 つの方法は、2 つのマクロを定義することです。
#define ENTER_CLASS_SCOPE
# undef IN_CLASS
# define IN_CLASS 1
#define EXIT_CLASS_SCOPE
# undef IN_CLASS
# define IN_CLASS 0
そして#define IN_CLASS 0
最初に持っています。cpp
次に、メンバー関数を定義するファイルの先頭と末尾でこれらのマクロを使用して、DEBUG
マクロ内のフラグを確認できます。