Нет необходимости усложнять вещи, чем они должны быть.Наследие здесь бесполезно, если только вы не хотите использовать виртуальные методы, и в этом случае вы не будете широко использовать шаблоны.Вот обновленная версия вашего кода.Просто добавьте другие классы регистратора, когда вам нужны новые.
class stdout_logger_t
{
public:
typedef stdout_logger_t logger_type;
template<typename data_t>
logger_type& log(const data_t& data) {
cout << data << endl;
return *this;
}
};
class lazy_logger_t
{
public:
typedef lazy_logger_t logger_type;
template<typename data_t>
logger_type& log(const data_t& data) {
return *this;
}
};
template<typename logger_t, typename data_t>
void output(logger_t& logger, const data_t& data) {
logger.log(data);
}
template<typename logger_t, typename data_t>
logger_t& operator<< (logger_t& logger, const data_t& data) {
output(logger, data);
return logger;
}
stdout_logger_t logger;
lazy_logger_t lazyLogger;
logger << "Hi " << 1;
lazyLogger << "Hi " << 1;
Будьте осторожны, я уверен, что эта система регистратора не будет работать с std :: endl.