c++ - 基类派生的子类如何自动调用方法或生成代码?

标签 c++ c++11 metaprogramming

我有一些描述能力/行为的类,例如飞行或驾驶等。这些类中的每一个都有一个必须调用的特定方法来加载一些数据 - 例如,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;
}

需要提及的更改:

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

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

关于c++ - 基类派生的子类如何自动调用方法或生成代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40904700/

相关文章:

c++ - Travis CI 上 Boost 中对 `std::__cxx11::basic_string 的 undefined reference

c++ - 元组和总结

ruby 元编程父类(super class)不继承

ruby - 自定义 Hook /回调/宏方法

c++ - C/C++ 创建一个带有负值的枚举,而不必对其编号

c++ - 使用 ifstream 解析文本的惯用方式是什么?

c++ - directx 上的一切都消失了

c++ - 十进制转二进制加两个补码

C++11 自日期以来的天数

c++ - 如何在 Qt Creator 4.8 中使用 C++11