#include <iostream>
#include <tuple>
#include <string>
struct Logger2
{
explicit Logger2(const std::string& name) : name(name) {}
Logger2& operator << (const std::pair<const char*, const char*>& p)
{
std::cout << name << ":" << p.first << " " << p.second << std::endl;
return *this;
}
std::string name;
};
struct Logger
{
Logger& operator << (const std::string& s)
{
std::cout << "Log:" << s << std::endl;
return *this;
}
Logger2 operator () (const std::string& name) const
{
return Logger2{name};
}
};
#define LOG Logger{}
int main()
{
LOG << "old log";
LOG("NamedLogger") << std::make_pair("hello", "world");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxzdHJpbmc+CgpzdHJ1Y3QgTG9nZ2VyMgp7CiAgICBleHBsaWNpdCBMb2dnZXIyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSA6IG5hbWUobmFtZSkge30KICAgIExvZ2dlcjImIG9wZXJhdG9yIDw8IChjb25zdCBzdGQ6OnBhaXI8Y29uc3QgY2hhciosIGNvbnN0IGNoYXIqPiYgcCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgbmFtZSA8PCAiOiIgPDwgcC5maXJzdCA8PCAiICIgPDwgcC5zZWNvbmQgPDwgc3RkOjplbmRsOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIHN0ZDo6c3RyaW5nIG5hbWU7Cn07CgpzdHJ1Y3QgTG9nZ2VyCnsKICAgIExvZ2dlciYgb3BlcmF0b3IgPDwgKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiTG9nOiIgPDwgcyA8PCBzdGQ6OmVuZGw7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIExvZ2dlcjIgb3BlcmF0b3IgKCkgKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBMb2dnZXIye25hbWV9OwogICAgfQp9OwoKI2RlZmluZSBMT0cgTG9nZ2Vye30KCgppbnQgbWFpbigpCnsKICAgIExPRyA8PCAib2xkIGxvZyI7CiAgICBMT0coIk5hbWVkTG9nZ2VyIikgPDwgc3RkOjptYWtlX3BhaXIoImhlbGxvIiwgIndvcmxkIik7Cn0K