有条件地选择要继承的类

Posted

技术标签:

【中文标题】有条件地选择要继承的类【英文标题】:Conditionally to choose which classes to inherit 【发布时间】:2020-09-26 03:21:05 【问题描述】:

所以,我有一个菱形层次结构。

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 应该什么都不继承? 在我的例子中,一个总是true,但也可以是true。两者都不能是false。但我很想知道它什么都不继承的情况。 struct empty; class Join : std::conditional_t&lt;HAS_A, Derived_A, empty&gt; 重复 B. 指定基类而不是使用bool 作为模板参数似乎更直接。例如template&lt;class... Base&gt; class Join : public Base... ;,然后像 Join&lt;Derived_A, Derived_B&gt;Join&lt;Derived_A&gt;Join&lt;Derived_B&gt;Join&lt;&gt; 一样使用它。 谢谢,这两个建议都有效。我要试试@songyuanyao's,看起来正是我需要的,我不必管理布尔值。 【参考方案1】:

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

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

然后像 Join&lt;Derived_A, Derived_B&gt;Join&lt;Derived_A&gt;Join&lt;Derived_B&gt;Join&lt;&gt; 一样使用它(不继承任何内容)。

【讨论】:

以上是关于有条件地选择要继承的类的主要内容,如果未能解决你的问题,请参考以下文章

有条件地选择要在 FOR LOOP 中迭代的集合

父类对象与子类对象相互转化的条件是啥?如何实现它们的相互转化?

在选择多个复选框(即 5)后,我有条件将禁用的类添加到我的 div

有条件地选择 postgresQL 中的列

防止有条件地选择输入值更改

有条件地选择 MYSQL 列