如果子类派生自基类,如何自动调用方法或生成代码?

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)

Sto*_*ica 8

肯定是可能的.但是,您需要使用一些约定,因此代码可以是通用的.现场观看.

#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)

需要提及的变化:

  1. Load必须更改每个具体功能的返回类型.这是为了便于扩展参数包中的"数组技巧".
  2. 由于同样的原因,所有加载函数的名称都是相同的.

一旦c ++ 17和折叠表达式推出,Reason(1)可能会过时.

  • 在非void函数[main()除外)中省略return语句并使用返回的值会产生Undefined Behavior.对? (2认同)
  • @WF你可能想要转换为`void`,否则它会因病态情况而中断(其中`loadConcreteData`返回一个重载`operator,`的类型) (2认同)
  • @WF不.只需在括号内定期使用内置逗号运算符. (2认同)