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