#include <iostream>
class Logger
{
std::string _entry;
public:
Logger(std::string entry)
{
_entry = entry;
std::cout << "Starting execution of " << entry << std::endl;
}
~Logger()
{
std::cout << "Ending execution of " << _entry << std::endl;
}
};
class A
{
public:
void foo()
{
std::cout << "Doing foo" << std::endl;
}
};
#define CALL_FUNC_AND_LOG(obj,func) \
{ \
Logger _mylogger(""#func); \
obj.func(); \
\
}
int main()
{
A a;
CALL_FUNC_AND_LOG(a,foo);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgTG9nZ2VyCnsKICAgIHN0ZDo6c3RyaW5nIF9lbnRyeTsKICAgIHB1YmxpYzoKICAgICAgICBMb2dnZXIoc3RkOjpzdHJpbmcgZW50cnkpCiAgICAgICAgewogICAgICAgICAgICBfZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJTdGFydGluZyBleGVjdXRpb24gb2YgIiA8PCBlbnRyeSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQoKICAgICAgICB+TG9nZ2VyKCkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRW5kaW5nIGV4ZWN1dGlvbiBvZiAiIDw8IF9lbnRyeSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQp9OwoKY2xhc3MgQQp7CiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBmb28oKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJEb2luZyBmb28iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB9Cn07CgojZGVmaW5lIENBTExfRlVOQ19BTkRfTE9HKG9iaixmdW5jKSBcCiAgICB7IFwKICAgICAgICBMb2dnZXIgX215bG9nZ2VyKCIiI2Z1bmMpOyBcCiAgICAgICAgb2JqLmZ1bmMoKTsgXAogICAgICAgIFwKICAgIH0KICAgIAppbnQgbWFpbigpCnsKICAgIEEgYTsKICAgIENBTExfRlVOQ19BTkRfTE9HKGEsZm9vKTsKICAgIHJldHVybiAwOwp9Cg==