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 回答