我没有读过 Modern C++ Design 这本书,但发现通过模板进行行为注入的想法很有趣。我现在正在尝试自己应用它。
我有一个类有一个我认为可以作为策略注入的记录器。记录器有一个 log() 方法,该方法根据其策略采用 std::string 或 std::wstring :
// basic_logger.hpp
template<class String>
class basic_logger
{
public:
typedef String string_type;
void log(const string_type & s) { ... }
};
typedef basic_logger<std::string> logger;
typedef basic_logger<std::wstring> wlogger;
// reader.hpp
template<class Logger = logger>
class reader
{
public:
typedef Logger logger_type;
void read()
{
_logger.log("Reading...");
}
private:
logger_type _logger;
};
现在的问题是,读者应该像上面那样将 Logger 作为参数,还是应该使用 String 然后将 basic_logger 实例化为实例变量?像这样:
template<class String>
class reader
{
public:
typedef String string_type;
typedef basic_logger<string_type> logger_type;
// ...
private:
logger_type _logger;
};
正确的方法是什么?