如何解决接口中的虚拟可变参数模板方法
在 C++ 中不能有虚拟模板方法。我想要一个接口和一些实现它的类。例如:
class Logger {
public:
template<typename... Args>
virtual void Error(const std::string& message,Args... args) const = 0;
};
class ConsoleLogger : public Logger {
public:
template<typename... Args>
void Error(const std::string& message,Args... args) const{}
};
有什么解决办法吗?我还是想用界面。
解决方法
尽管“更喜欢组合而不是继承”往往被盲目地模仿,但它在这里确实派上用场。
class LoggerImpl {
public:
virtual ~LoggerImpl() {}
virtual void dispatch(const std::string& message,std::vector<std::string> args) = 0;
};
class Logger {
std::unique_ptr<LoggerImpl> _impl;
public:
Logger(std::unique_ptr<LoggerImpl> impl) : _impl(impl) {}
template<typename... Args>
void Error(const std::string& message,Args... args) const {
std::vector<std::string> args_as_strings;
// Make strings from args
_impl->dispatch(message,std::move(args_as_strings));
}
};
实际上如何将参数传递给 _impl
不一定是向量。这主要是一个实现细节。只要您使用的任何机制都是“虚拟友好的”。它会工作得很好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。