Kai*_*zay 2 c++ metaprogramming c++11
我有一些描述能力/行为的类,比如飞行或驾驶等.每个类都有一个特定的方法,必须调用它来加载一些数据 - 例如,Flyable有loadFlyData(),Drivable有loadDriveData().对于每个类,方法名称是唯一的.
我有许多派生类可以从一个或多个这些行为类继承.每个派生类都有一个调用的方法loadData(),在此我们应该调用所有父类行为的方法,如loadFlyData(),loadDriveData()等....是否有办法来自动生成使用元编程这种方法吗?由于有许多派生类,如果我可以使用元编程生成这些方法,它可能更易于维护...
行为类:(一个对象类可能有任何这些行为,并且必须调用那些类"加载"方法......
class Flyable {
void loadFlyData() {
}
};
class Drivable{
void loadDriveData() {
}
};
Run Code Online (Sandbox Code Playgroud)
所有对象类都派生自Object:
class Object {
virtual void loadData() {
}
};
Run Code Online (Sandbox Code Playgroud)
派生类:
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();
}
};
Run Code Online (Sandbox Code Playgroud)
肯定是可能的.但是,您需要使用一些约定,因此代码可以是通用的.现场观看.
#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;
}
Run Code Online (Sandbox Code Playgroud)
需要提及的变化:
Load必须更改每个具体功能的返回类型.这是为了便于扩展参数包中的"数组技巧".一旦c ++ 17和折叠表达式推出,Reason(1)可能会过时.
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |