有条件地选择要继承的类
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_A
和HAS_B
都是false
时,Join
应该什么都不继承?
在我的例子中,一个总是true
,但也可以是true
。两者都不能是false
。但我很想知道它什么都不继承的情况。
struct empty; class Join : std::conditional_t<HAS_A, Derived_A, empty>
重复 B.
指定基类而不是使用bool
作为模板参数似乎更直接。例如template<class... Base> class Join : public Base... ;
,然后像 Join<Derived_A, Derived_B>
、Join<Derived_A>
、Join<Derived_B>
、Join<>
一样使用它。
谢谢,这两个建议都有效。我要试试@songyuanyao's,看起来正是我需要的,我不必管理布尔值。
【参考方案1】:
指定基类而不是使用bool
作为模板参数似乎更直接。例如
template<class... Base> class Join : public Base... ;
然后像 Join<Derived_A, Derived_B>
、Join<Derived_A>
、Join<Derived_B>
和 Join<>
一样使用它(不继承任何内容)。
【讨论】:
以上是关于有条件地选择要继承的类的主要内容,如果未能解决你的问题,请参考以下文章
父类对象与子类对象相互转化的条件是啥?如何实现它们的相互转化?