首页 > 解决方案 > 接口中的虚拟可变参数模板方法

问题描述

在 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{} 
};

有什么解决方法吗?我还是想用这个界面。

标签: c++templatesinterfacevariadic

解决方案


尽管“更喜欢组合而不是继承”往往被盲目地模仿,但它确实在这里派上了用场。

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不一定是向量。这主要是一个实现细节。只要您使用的任何机制都是“虚拟友好的”。它会正常工作的。


推荐阅读