【发布时间】: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,看起来正是我需要的,我不必管理布尔值。
标签: c++ templates inheritance