2

非静的コンテキストでthisポインターにアクセスし、静的コンテキストで他の何かを自動的に使用することは可能ですか? マクロやテンプレートマジックを知っていますか?

#define LOG std::cout << _is_the_this_pointer_available_ ? this : 0

class Foo {
  void test() {
    LOG;
  }
};

void staticTest() {
  LOG;
}
4

3 に答える 3

3

マクロやテンプレートマジックを知っていますか?

正直なところ、マクロでこれを行うことはありません。マクロなしで何かができる場合は、それらを避けることをお勧めします。オーバーロード、CRTP、および継承 (マクロなし) に基づく可能な解決策を次に示します。

int get_this() { return 0; }

template<typename T>
struct get_this_helper
{
    T* get_this() { return static_cast<T*>(this); }
};

get_this_helper<>唯一のオーバーヘッドは、以下に示すように、クラスを の適切な特殊化から派生させる必要があることです。

#include <iostream>

#define LOG std::cout << get_this() << std::endl;

class Foo : public get_this_helper<Foo> {
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//        This is the only thing that requires 
//        being changed wrt your version of Foo
public:
  void test() {
    LOG;
  }
};

void staticTest() {
  LOG;
}

簡単なテスト プログラムを次に示します。

int main()
{
    Foo f;
    f.test();
    staticTest();
}

そしてライブの例

于 2013-04-10T10:47:32.383 に答える
3

次の手法を使用して、このポインターをログに書き込みます。

#define GET_THIS() __if_exists(this) { this; } __if_not_exists(this) { nullptr; } 

ただし、これは Microsoft 固有です。

于 2013-04-10T11:52:25.330 に答える
1
#define LOG std::cout << isThisAvailable()

bool isThisAvailable() { return false; }
struct X
{
    bool isThisAvailable() { return true; }

    void test() { LOG; }
};

void staticTest()
{
   LOG;
}

isThisAvailableクラス内で呼び出すと、 が返されtrueます。クラス コンテキストの外で呼び出すと、 free 関数が呼び出されて が返されfalseます。

于 2013-04-10T10:45:16.053 に答える