假设我有一些类架构(类的数量在开发过程中不断增加),每个类都继承自 N 个具有相同基本接口的类。创建将迭代继承的基函数(在基类或派生类中)的最佳方法是什么(如果可能)?
目标:避免开发人员的错误,确保我们不会忘记从所有继承中调用所有基本函数,并使代码更清晰易读和易于理解。
请参阅更新状态的编辑说明
简短的例子:
class shared_base {
public:
virtual void func() = 0;
}
class base_1 : virtual public shared_base {
public:
void func() override {}
}
class base_2 : virtual public shared_base {
public:
void func() override {}
}
class target : virtual public base_1, virtual public base_2 {
public:
void func() override {
// Instead of:
base_1::func();
base_2::func();
// ... My func() implementation
/*
~~TODO~~
for_each(std::begin(inheritances), std::end(inheritances), [](auto& inheritance) -> void { inheritance::func(); })
~~TODO~~
*/
}
}
更具描述性和实用性的示例:
class base {
public:
virtual void func() = 0;
/*...Some interface (pure virtual) functions...*/
}
class base_core : virtual public base {
public:
void func() override {}
/*...Some base implementations for the rest...*/
protected:
template <typename FuncT>
virtual void iterate_over_base_core_inheritances(FuncT function_to_apply) {
/*~~TODO~~*/
}
}
template <class Decorator = base_core, typename = typename std::enable_if<std::is_base_of<base_core, Decorator>::value>::type>
class core_1 : virtual public Decorator {
public:
void func() override {
// Will iterate (once) over Decorator
/*iterate_over_base_core_inheritances([](core_base*) -> void {
// Implementation
});*/
// Instead of:
Decorator::func();
}
/*More functions implementations*/
}
template <class Decorator = base_core, typename = typename std::enable_if<std::is_base_of<base_core, Decorator>::value>::type>
class core_2 : virtual public core_1<>, virtual public Decorator {
public:
void func() override {
// Will iterate (twice) over core_1 and Decorator
/*iterate_over_base_core_inheritances([](core_base*) -> void {
// Implementation
});*/
// Instead of:
Decorator::func();
core_1::func();
//... Self func() implementation
}
/*More functions implementations*/
protected:
// If it's not possible doing it in the upper hierarchy level is it possible do it here?
template <typename FuncT>
void iterate_over_base_core_inheritances(FuncT function_to_apply) override {
/*~~TODO~~*/
}
}
一些事情要知道:
- 我正在使用 Linux 64x 平台(Ubuntu 16.04)——如果答案很重要的话。
- 这段代码背后的想法是创建一种易于扩展和理解的 Decorator DP,并使开发人员能够使用
protected
基类的功能/属性。
一个实际的例子(供我实际使用)可以在这个 commit中找到。
编辑:
感谢@RaymondChen,我得到了一个可行的解决方案,(到目前为止)只有一个小问题:每次我想使用以这种方式实现的类时,我都需要core_base
在它的模板参数列表中指定该类(之前-我正在使用默认类型参数)。我正在寻找解决此问题的方法。
目前的解决方案:
template <class ...Decorators>
class core_2 : virtual public Decorators... {
public:
static_assert((std::is_base_of<base_core, Decorators>::value && ...), "All decorators must inherit from base_core class.");
void func() override {
(Decorators::func(), ...);
//... Self func() implementation
}
/*More functions implementations*/
}
创建实例示例:
当前:
std::shared_ptr<base> base = std::make_shared<core_2<core_1<base_core>, core_3<base_core>>>();
期望:在此提交中可以找到
std::shared_ptr<base> base = std::make_shared<core_2<core_1<>, core_3<>>>();
一个实际示例(供我实际使用) 。