3

コンテキストで「this」の使用が許可されているかどうかを判断する方法はありますか?

私の目標は、コンテキストに応じて「this」を使用するロギング用の汎用マクロを作成することです(たとえば、「this」の値を出力する場合)。

4

2 に答える 2

2

これができたとしても、それを使用することはできません。コードは、呼び出されない場合でも合法である必要があり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メンバー変数のない基本クラスでポインターが変更されないことを期待する必要があります。

于 2013-01-11T23:05:39.230 に答える
1

デバッグ目的で基本クラスを定義する余裕がある場合は、グローバルおよびクラス メンバー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マクロ内のフラグを確認できます。

于 2013-01-11T23:18:50.550 に答える