#include <iostream>
#include <memory>
struct LoggingConfig {};
class Logging {
public:
explicit Logging(const LoggingConfig& config) {}
template<typename T>
static std::unique_ptr<T> CreateIfLoggingEnabled(const LoggingConfig& config) {
return std::make_unique<T>(config);
}
};
class LoggingString : public Logging {
public:
using Logging::Logging;
void writeLog(std::string str) { std::cout << "[LoggingString] " << str << std::endl; }
};
class LoggingInt : public Logging {
public:
using Logging::Logging;
void writeLog(int i) { std::cout << "[LoggingInt] " << i << std::endl; }
};
int main()
{
auto logger1 = Logging::CreateIfLoggingEnabled<LoggingString>(LoggingConfig{});
logger1->writeLog("hello");
auto logger2 = Logging::CreateIfLoggingEnabled<LoggingInt>(LoggingConfig{});
logger2->writeLog(12345);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IExvZ2dpbmdDb25maWcge307CgpjbGFzcyBMb2dnaW5nIHsKcHVibGljOgogICAgZXhwbGljaXQgTG9nZ2luZyhjb25zdCBMb2dnaW5nQ29uZmlnJiBjb25maWcpIHt9CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VD4gQ3JlYXRlSWZMb2dnaW5nRW5hYmxlZChjb25zdCBMb2dnaW5nQ29uZmlnJiBjb25maWcpIHsKICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxUPihjb25maWcpOwogICAgfQp9OwoKY2xhc3MgTG9nZ2luZ1N0cmluZyA6IHB1YmxpYyBMb2dnaW5nIHsKcHVibGljOgogICAgdXNpbmcgTG9nZ2luZzo6TG9nZ2luZzsKCiAgICB2b2lkIHdyaXRlTG9nKHN0ZDo6c3RyaW5nIHN0cikgeyBzdGQ6OmNvdXQgPDwgIltMb2dnaW5nU3RyaW5nXSAiIDw8IHN0ciA8PCBzdGQ6OmVuZGw7IH0KfTsKCmNsYXNzIExvZ2dpbmdJbnQgOiBwdWJsaWMgTG9nZ2luZyB7CnB1YmxpYzoKICAgIHVzaW5nIExvZ2dpbmc6OkxvZ2dpbmc7CgogICAgdm9pZCB3cml0ZUxvZyhpbnQgaSkgeyBzdGQ6OmNvdXQgPDwgIltMb2dnaW5nSW50XSAiIDw8IGkgPDwgc3RkOjplbmRsOyB9Cn07CgppbnQgbWFpbigpCnsKCWF1dG8gbG9nZ2VyMSA9IExvZ2dpbmc6OkNyZWF0ZUlmTG9nZ2luZ0VuYWJsZWQ8TG9nZ2luZ1N0cmluZz4oTG9nZ2luZ0NvbmZpZ3t9KTsKCWxvZ2dlcjEtPndyaXRlTG9nKCJoZWxsbyIpOwoJCglhdXRvIGxvZ2dlcjIgPSBMb2dnaW5nOjpDcmVhdGVJZkxvZ2dpbmdFbmFibGVkPExvZ2dpbmdJbnQ+KExvZ2dpbmdDb25maWd7fSk7Cglsb2dnZXIyLT53cml0ZUxvZygxMjM0NSk7CgoJcmV0dXJuIDA7Cn0=