我有一些描述能力/行为的类,例如飞行或驾驶等。这些类中的每一个都有一个必须调用的特定方法来加载一些数据 - 例如,Flyable 有 loadFlyData()
,Drivable 有 loadDriveData()
。对于每个类,方法名称都是唯一的。
我有许多派生类可能继承自这些行为类中的一个或多个。这些派生类中的每一个都有一个名为loadData()
的方法,我们应该在其中调用所有父行为类的方法,例如loadFlyData()
、loadDriveData()
等....有没有办法使用元编程自动生成此方法?由于有很多派生类,如果我可以使用元编程生成这些方法可能更易于维护......
行为类:(对象类可能具有这些行为中的任何一种,并且必须调用该类的“加载”方法...
class Flyable {
void loadFlyData() {
}
};
class Drivable{
void loadDriveData() {
}
};
所有对象类都派生自 Object:
class Object {
virtual void loadData() {
}
};
派生类:
class FlyingCar : public Object, public Flyable, public Drivable {
virtual void loadData() override {
// How to automatically generate code so that the next two lines are called:
loadFlyData();
loadDriveData();
}
};
最佳答案
当然可以。但是,您需要采用一些约定,以便代码可以通用。 See it live .
#include <iostream>
using namespace std;
struct Flyable{
int loadConcreteData(){
cout << "Flyable\n"; return 0;
}
};
struct Drivable{
int loadConcreteData(){
cout << "Drivable\n"; return 0;
}
};
class Object{
virtual void loadData(){
}
};
template<class ...CS>
struct ConcreteLoader : Object, CS... {
void loadData() override {
int load[] = {
this->CS::loadConcreteData()...
};
}
};
class FlyingCar : public ConcreteLoader<Flyable,Drivable>{
};
int main() {
FlyingCar fc;
fc.loadData();
return 0;
}
需要提及的更改:
- 必须更改每个具体
Load
函数的返回类型。这是为了方便“数组技巧”扩展参数包。 - 同样出于同样的原因,所有加载函数的名称都是相同的。
一旦 c++17 和折叠表达式推出,原因 (1) 可能会过时。
关于c++ - 基类派生的子类如何自动调用方法或生成代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40904700/