非静的コンテキストで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
ます。