【发布时间】:2016-12-01 07:18:19
【问题描述】:
我有一些描述能力/行为的类,例如飞行或驾驶等。这些类中的每一个都有一个特定的方法,必须调用它来加载一些数据 - 例如,Flyable 有loadFlyData(),Drivable 有@ 987654322@。对于每个类,方法名称都是唯一的。
我有许多派生类,它们可能继承自这些行为类中的一个或多个。这些派生类中的每一个都有一个名为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();
}
};
【问题讨论】:
-
loadFlyData()和loadDriveData可以同名吗?这样它们只能通过范围来区分,Flyable::loadData()和Drivable::loadData()?如果是这样,那么一个基于模板的方法来调用每个T::loadData()其中 T 是一个基类,应该可以工作。虽然不确定如何以可变参数的形式获取基类列表。 -
如果所有基础对象对“加载”函数使用相同的名称(例如
loadData),则可以创建一个预处理步骤来获取源文件并对其进行修改。使用模板元编程可能是可能的,但它可能会比它的价值更多的工作(并且您当前的解决方案将更少编写,更重要的是更易于阅读和维护)。也可以在运行时创建代码,但这要困难得多,并且会使其可读性和可维护性更低。您现在拥有的只是最好和最简单的解决方案。 -
是的,我们可以为 loadFlyData 和 loadDriveData 使用相同的名称。对我来说(来自java背景)的困惑是如果它们具有相同的名称(这就是我使用不同名称的原因)如何处理冲突。下面给出的答案是我正在寻找的东西(通过讲故事的人和 krzaq)。我不知道你可以用 C++ 做这些事情!
标签: c++ c++11 metaprogramming