如何根据容器中对象的类型来解析调用哪个函数?

hil*_*sia 5 c++ inheritance containers

我有一些基本的继承树:

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
};
Run Code Online (Sandbox Code Playgroud)

我有一个容器,指向一个DerivedA或多个DerivedB实例的指针.

void f1(std::vector<Base*> a) () { /* some code */ }

int main(in, char**) {
  std::vector<Base*> base_container;
  f1(base_container); // works fine
}
Run Code Online (Sandbox Code Playgroud)

几乎所有东西都在Base上工作,但是我有一些函数,没有在DerivedA或中指定DerivedB,是特定于实现的,但是在一个DerivedADerivedB容器上工作.我们假设以下代码片段:

void f2(std::vector<DerivedA*> a) () { /* implementation A specific code */ }
void f2(std::vector<DerivedB*> a) () { /* implementation B specific code */ }
Run Code Online (Sandbox Code Playgroud)

调用正确函数的最佳做法是什么?我列出了一些可能的解决方案,我想到了这些解决方案,但它们都有很大的缺点.

  1. 我可以在实现特定的容器中保存所有数据.但是,f1()由于std::vector<DerivedA*>不是孩子std::vector<Base*>(因为有充分理由!),因此不再适用.

  2. 我可以一直手动转换所有对象,但这很难看.

  3. 我可以手动调用正确的函数,通过给它们提供与众不同的名称(例如f2_af2_b)来获得Base容器,但这看起来很难看.

  4. 我可以将f2实现为函数模板特化,但这似乎是滥用.

  5. 我可以尝试使容器上的函数仅依赖于容器中对象的函数,然后为它们实现重载函数.这是在一些情况下一个很好的解决方案,但对我来说这真的是一个函数在容器上,容器上给予不同的实现为DerivedADerivedB,不只是遍历容器的内容.

你会如何实现这样的事情?我怎样才能得到一个容器,它能够被传递到两个f1()f2()

Mar*_*k B 1

最好的解决方案是让您的继承代表替换,并让基类具有完成所有工作的完整接口,使用虚拟方法来选择要使用的派生类方法。然后f2只需要一个基指针向量。

否则,如果您需要访问的派生类中确实存在特定不同的接口(如果有,请花点时间考虑一下您的设计做了什么),那么您最好的方法是使用不同命名的方法,每个派生类都有一个不同的名称类型,每个类型都接受一个基指针向量。通过适当命名的方法,用户将清楚需要哪种类型。