所以,我有一个钻石层次结构。
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
应该不继承任何东西吗? - songyuanyaostruct empty{}; class Join : std::conditional_t<HAS_A, Derived_A, empty>
重复B。 - Raymond Chenbool
更为直观。例如,template<class... Base> class Join : public Base... {};
,然后可以像这样使用它:Join<Derived_A, Derived_B>
、Join<Derived_A>
、Join<Derived_B>
、Join<>
。 - songyuanyao