gpt4 book ai didi

c++ - 应用基于策略的设计问题

转载 作者:太空狗 更新时间:2023-10-29 21:08:42 25 4
gpt4 key购买 nike

我没有读过《现代 C++ 设计》一书,但发现通过模板进行行为注入(inject)的想法很有趣。我现在正在尝试自己应用它。

我有一个类,它有一个我认为可以作为策略注入(inject)的记录器。记录器有一个 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;
};

正确的方法是什么?

最佳答案

要实际使用策略类,策略需要是模板参数。一个例子是 basic_string 的 char_traits 参数,尽管它的实现方式不同于 MC++D 的策略,它使用继承来利用空基类优化并允许轻松添加到类的公共(public)接口(interface)(比包装每个可能的方法;再次阅读 MC++D)。您仍然可以提供默认值:

template<class String, class Logger=basic_logger<String> >
struct reader : Logger {
void read() {
this->log("Reading...");
}
};

关于c++ - 应用基于策略的设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com