#include <iostream>
class Logger
{
public:
void log(std::string entry)
{
std::cout << entry << std::endl;
}
};
class A
{
Logger mylog;
public:
void foo()
{
std::cout << "Doing foo" << std::endl;
}
Logger& getLogger()
{
return mylog;
}
};
#define CALL_FUNC_AND_LOG(obj,func) \
{ obj.getLogger().log("Logging "#func); obj.func(); }
int main()
{
A a;
CALL_FUNC_AND_LOG(a,foo);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgTG9nZ2VyCnsKICAgIHB1YmxpYzoKICAgICAgICB2b2lkIGxvZyhzdGQ6OnN0cmluZyBlbnRyeSkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBlbnRyeSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQp9OwoKY2xhc3MgQQp7CiAgICBMb2dnZXIgbXlsb2c7CiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBmb28oKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJEb2luZyBmb28iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB9CgogICAgICAgIExvZ2dlciYgZ2V0TG9nZ2VyKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBteWxvZzsKICAgICAgICB9Cn07CgojZGVmaW5lIENBTExfRlVOQ19BTkRfTE9HKG9iaixmdW5jKSBcCiAgICB7IG9iai5nZXRMb2dnZXIoKS5sb2coIkxvZ2dpbmcgIiNmdW5jKTsgb2JqLmZ1bmMoKTsgfQoKaW50IG1haW4oKQp7CiAgICBBIGE7CiAgICBDQUxMX0ZVTkNfQU5EX0xPRyhhLGZvbyk7CiAgICByZXR1cm4gMDsKfQo=