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