*在独立功能中进行此仿真

时间:2014-05-20 08:59:57

标签: c++ this

假设我有这种记录功能:

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        
}

或许这个任务有更优雅的解决方案?

1 个答案:

答案 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();
}