c++ - 接口中的虚拟可变参数模板方法
问题描述
在 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));
}
};
您实际上如何将 args 传递给_impl
不一定是向量。这主要是一个实现细节。只要您使用的任何机制都是“虚拟友好的”。它会正常工作的。
推荐阅读
- sas - SAS - 在proc制表过程中省略缺失值
- asp.net - ssis 中的 Newtonsoft.json dll 问题
- multithreading - 游戏服务器是否为每个用户请求创建线程(如 dota 2)?
- json - EvaluateJsonPath 无法返回标量
- vba - 如何在 Powerpoint 幻灯片上找到形状的标签
- delphi - 为什么 Delphi XE3 中没有出现代码提示?
- pandas - AWS Sagemaker:AttributeError:模块“熊猫”没有属性“核心”
- c++ - Linux Visual Studio Code C++ File Not Found
- matplotlib - 如何标记顶点并将 x 和 y 值添加到坐标中?
- makefile - 在 MacOS 的 Clion 中,rocksdb 构建失败