是否可以在非静态上下文中访问this指针并在静态上下文中自动使用其他东西?你知道任何宏或模板魔法吗?
#define LOG std::cout << _is_the_this_pointer_available_ ? this : 0
class Foo {
void test() {
LOG;
}
};
void staticTest() {
LOG;
}
你知道任何宏或模板魔法吗?
老实说,我不会用宏来做这件事。当可以在没有宏的情况下完成某些事情时,我建议避免使用它们。这是基于重载、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();
}
还有一个活生生的例子。
我正在使用以下技术将此指针写入日志:
#define GET_THIS() __if_exists(this) { this; } __if_not_exists(this) { nullptr; }
但是,它是 Microsoft 特定的。
#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
。