我意识到我想要做的事情可能是错的,所以我很乐意接受和替代方法。 以下所有代码只是一个例子。
假设我有一个派生类,有多个基类:
template<typename... Bases> class Derived : public Bases...{
public:
VariadicTemplate(BaseClasses&&... base_classes) : BaseClasses(base_classes)... {}
void DoAllFoo();
};
所有基类都有一个名为DoFoo()的方法。我将使用公共方法Foo():
从公共基础派生它们class CommonBase {
public:
virtual Foo() { DoFoo() };
protected:
virtual void DoFoo() = 0;
};
class Base1 : public CommonBase {
DoFoo() { /* displays something */ };
};
class Base2 : public CommonBase {
DoFoo() { /* displays something else */ };
};
....
现在这就是我要用它的方式。我想实例化一些使用不同Base类指定的Derived类对象:
Devired<Base1, Base2> x;
Devired<Base5, Base7, Base21> y;
...
x.DoAllFoo();
y.DoAllFoo();
我想(以某种方式)Derived的DoAllFoo()到#34;迭代&#34;在它的基类上调用每个类Foo()方法。
我能想象的唯一解决方案是在Derived中有一些函数指针/仿函数/任何东西,并且在构造时让所有Bases在这个集合中注册它们的Foo()方法。这可能会奏效,但看起来可以做得更好。
我希望,我不熟悉解决这个问题的一些常见模式(或者我只是纯粹的错误),所以请指教。 谢谢。
答案 0 :(得分:3)
你想要:
void DoAllFoo()
{
using expand = int[];
static_cast<void>(expand{ 0, (static_cast<Bases*>(this)->Foo(), void(), 0)... });
}
或:
void DoAllFoo()
{
using expand = int[];
static_cast<void>(expand{ 0, (Bases::Foo(), void(), 0)... });
}
取决于对Foo
本身的调用是否应该是虚拟的。
答案 1 :(得分:1)
我将使用的模式只是组合而不是继承。为什么不将基类的对象作为您现在称为SELECT ah type
, MAX(CASE WHEN av = 'A' THEN score END) 'A'
, MAX(CASE WHEN av = 'B' THEN score END) 'B'
FROM my_table
GROUP
BY ah;
+------+------+------+
| type | A | B |
+------+------+------+
| A | 1.00 | 2.00 |
| B | 0.50 | 0.14 |
+------+------+------+
的成员?您只需将它们存储到Derived
中,然后在std::vector
内迭代它。
例如:
DoAllFoo