#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");
}
