假设我有这种记录功能:
struct Identifier
{
Identifier(const int id) : id(id) {}
int id;
};
#define LOG(x) std::cout << this->id << x << std::endl;
class SomeClass : Identifier
{
SomeClass() : Identifier(123) {}
void helloFunc()
{
LOG("hello"); // will print to cout: "123hello"
}
};
我想在独立函数中使用相同的LOG
宏。如何为this
创建某种存根?能够编写这样的代码:
void standaloneHelloFunc()
{
LOG("standalone_hello");
// "this" does not exists here, but some magic do the job
// and this macro must print only "standalone_hello" to cout
}
或许这个任务有更优雅的解决方案?
答案 0 :(得分:1)
这是一个可能的解决方案:使用相同的名称,只是在不同的范围内。
#include <iostream>
#define LOG(x) do { log() << (x) << '\n'; } while(false)
std::ostream & log() { return std::clog; }
struct Identifier
{
std::ostream & log() { return ::log() << id << ": "; }
int id;
explicit Identifier(int n) : id(n) {}
};
struct SomeClass : Identifier
{
SomeClass() : Identifier(123) {}
void helloFunc()
{
LOG("hello"); // will print to cout: "123hello"
}
};
int main()
{
LOG("in main");
SomeClass().helloFunc();
}