接口中的虚拟变量模板方法

Virtual variadic template method in interface

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