有条件地选择继承哪些类

3

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

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时是否有效。


HAS_AHAS_B 都为 false 时,Join 应该不继承任何东西吗? - songyuanyao
在我的情况下,其中一个将始终为“true”,但两个也可以是“true”。两者都不能为“false”。但我很想了解它不继承任何内容的情况。 - Blizzard
2
struct empty{}; class Join : std::conditional_t<HAS_A, Derived_A, empty> 重复B。 - Raymond Chen
4
指定基类作为模板参数似乎比使用 bool 更为直观。例如,template<class... Base> class Join : public Base... {};,然后可以像这样使用它:Join<Derived_A, Derived_B>Join<Derived_A>Join<Derived_B>Join<> - songyuanyao
谢谢,这两个建议都可行。我会尝试@songyuanyao的建议,看起来正是我需要的,而且不用管理布尔值。 - Blizzard
1个回答

7

使用基类来指定模板参数,而不是使用bool似乎更加直接明了。例如:

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

然后像这样使用它:Join<Derived_A, Derived_B>Join<Derived_A>Join<Derived_B>,以及Join<>(没有继承)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接