将 abstract base class 中的所有纯虚函数定义为 varaidaic 模板
Define all pure virtual functions in abstract base class as a varaidaic template
单个可变参数函数可以处理所有基础 class 纯虚函数吗?在下面的情况下 Say
将覆盖 SayGreeting
和 SayGreetingLocation
.
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" 关系建模。
单个可变参数函数可以处理所有基础 class 纯虚函数吗?在下面的情况下 Say
将覆盖 SayGreeting
和 SayGreetingLocation
.
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" 关系建模。