我有一些基本的继承树:
class Base {
virtual double func() = 0;
// functionality is not important for the problem
// but it's good to know that Base has some virtual functions
};
class DerivedA : public Base {
virtual double func() {}; // implementation A
};
class DerivedB : public Base {
virtual double func() {}; // implementation B
};
我有一个容器,其中包含一个DerivedA
或多个DerivedB
实例的指针。
void f1(std::vector<Base*> a) () { /* some code */ }
int main(in, char**) {
std::vector<Base*> base_container;
f1(base_container); // works fine
}
几乎所有东西都可以在 Base 上运行,但是我有一些功能,没有在DerivedA
or中指定DerivedB
,它是特定于实现的,但可以在DerivedA
orDerivedB
容器上运行。让我们假设以下代码片段:
void f2(std::vector<DerivedA*> a) () { /* implementation A specific code */ }
void f2(std::vector<DerivedB*> a) () { /* implementation B specific code */ }
调用正确函数的最佳做法是什么?我列出了一些我想到的可能的解决方案,但它们都有很大的缺点。
我可以将所有数据保存在特定于实现的容器中。但是,由于不是(有充分理由!)的孩子,
f1()
因此不再起作用。std::vector<DerivedA*>
std::vector<Base*>
我可以一直手动投射所有对象,但这很难看。
f2_a
我可以通过给它们提供独特的名称(如and )手动调用需要 Base 容器的正确函数f2_b
,但这看起来很难看。我可以将 f2 实现为函数模板专业化,但这似乎是滥用。
我可以尝试使容器上的函数只依赖于容器中对象的函数,然后为它们实现重载函数。这在某些情况下是一个很好的解决方案,但在我的情况下,它确实是容器上的一个函数,在容器上为
DerivedA
and提供了不同的实现DerivedB
,而不仅仅是迭代容器的内容。
你将如何实施这样的事情?如何获得能够同时传递给f1()
和的 Container f2()
?