首页 > 解决方案 > 有条件地选择要继承的类

问题描述

所以,我有一个钻石层次结构。

class Base {
    // ...
}
    
class Derived_A : public Base {
    // ...
}
    
class Derived_B : public Base {
    // ...
}
    
class Join : public Derived_A, public Derived_B {
    // ...
}

根据模板变量,我想有条件地选择继承 A 和/或 B。(我理解菱形结构,A 和 B 可以虚拟继承。)我所拥有的是:

template<bool HAS_A, bool HAS_B>
class Join : public Derived_A, // enable if HAS_A
             public Derived_B  // enable if HAS_B
{
    // ...
}

我尝试使用std::enable_if_t,但我不确定当它的布尔值是false.

标签: c++templatesinheritance

解决方案


指定基类而不是bool用作模板参数似乎更直接。例如

template<class... Base> class Join : public Base... {}; 

然后像Join<Derived_A, Derived_B>, Join<Derived_A>, Join<Derived_B>, and Join<>(inherit nothing) 一样使用它。


推荐阅读