Problem with C++ templates -
i trying build small logger library. facig problem c++ templates. here class structure looks like.
class abstract_logger_t { public: typedef abstract_logger_t logger_type; template<typename data_t> abstract_logger_t& log(const data_t& data) { return *this; } }; class stdout_logger_t : public abstract_logger_t { public: typedef stdout_logger_t logger_type; template<typename data_t> stdout_logger_t& log(const data_t& data) { cout << data << endl; return *this; } }; template<typename logger_t, typename data_t> void output(logger_t& logger, const data_t& data) { static_cast<typename logger_t::logger_type&>(logger).log(data); cout << data; } template<typename data_t> abstract_logger_t& operator<< (abstract_logger_t& logger, const data_t& data) { output(logger, data); return logger; } stdout_logger_t logger; logger << "hi " << 1;
here expecting stdout_logger_t::log called output. looks derived type getting lost , abstract_logger_t::log ends getting called. can tell me if doing wrong ?
template<typename data_t> abstract_logger_t& operator<< (abstract_logger_t& logger, const data_t& data) { output(logger, data); return logger; }
here, whatever logger
pass in, compiler convert abstract_logger_t&
. need make first argument templated too.
template<typename t, typename data_t> t& operator<< (t& logger, const data_t& data) { output(logger, data); return logger; }
Comments
Post a Comment