私はModernC++ Designの本を読んでいませんが、テンプレートを介した動作インジェクションのアイデアが興味深いと感じました。私は今それを自分で適用しようとしています。
ポリシーとして注入できると思ったロガーを持ったクラスがあります。ロガーには、ポリシーに応じてstd::stringまたはstd::wstringを受け取るlog()メソッドがあります。
// 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;
};
ここでの質問は、読者が上記のようにロガーを引数として取る必要があるのか、それとも文字列を取り、次にbasic_loggerをインスタンス変数としてインスタンス化するのかということです。そのようです:
template<class String>
class reader
{
public:
typedef String string_type;
typedef basic_logger<string_type> logger_type;
// ...
private:
logger_type _logger;
};
行く正しい方法は何ですか?