将 abstract base class 中的所有纯虚函数定义为 varaidaic 模板

Define all pure virtual functions in abstract base class as a varaidaic template

单个可变参数函数可以处理所有基础 class 纯虚函数吗?在下面的情况下 Say 将覆盖 SayGreetingSayGreetingLocation.

class  Brain {

 private:
  virtual void SayGreeting(std::string greeting) = 0;
  virtual void SayGreetingLocation(std::string greeting, std::string location) = 0;
}

class Mouth: public Brain {

 public:
  Say(){}
  template<typename T, typename... Args>
  void Say(T first, Args... args) {
    std::cout << first;
    Say(args...)
  }
}

我不知道有什么方法可以自动执行此操作,我想这就是您要问的。我不确定是否有一个明智的宏黑客可以半自动化它。

手动将参数转发给 Say 的实现当然很简单:

void Mouth::SayGreetingLocation(std::string greeting, std::string location)
{
    this->Say(greeting, location);
}

一些旁白:

  • 您的 Say() 函数需要一个 0 参数 "terminating" 重载。
  • const std::string& 可能是更适合函数参数的类型,因为它通常更有效。 (除非你的函数改变了字符串。)

不直接。成员函数模板不能是虚拟的,要覆盖基 class 中的方法,该方法需要具有相同的名称和签名。但是你可以这样做:

#include <iostream>
#include <string>

class  Brain {    
private:
    virtual void SayGreeting(const std::string& greeting) = 0;
    virtual void SayGreetingLocation(const std::string& greeting,const std::string& location) = 0;
};

class Mouth: public Brain {    
    template<typename... Args>
    void Say(Args... args) {
        (std::cout << ... << args);
    }
public:
    void SayGreeting(const std::string& greeting) override {
        Say(greeting);
    }
    void SayGreetingLocation(const std::string& greeting, const std::string& location) override {
        Say(greeting,location);
    }
};

你的代码中有几个错误:缺少 ;std::cout << args 应该是 std::cout << first 你要么需要以某种方式停止递归,要么首先不使用递归.自 C++17 以来,模板的许多递归可以替换为 fold expressions.

PS:这也许只是一个例子,但你的继承看起来很奇怪。 Mouth 不是 Brain,但 public 继承确实为 "is-a" 关系建模。