演员表<A*>到列表<B*>其中B继承了A

cast list<A*> to list<B*> where B inherits A

本文关键字:gt lt 其中 继承 列表      更新时间:2023-10-16

我得到了一个函数

void doSomething(list<A*> list1, list<A*> list2)

和类

class B : A  
class C : A

是否有像

这样直接调用函数的方法?
void doSomething(list<B*> listOfB, list<C*> listOfC)

还是像

那样手动换行
void doSomething(list<B*> listOfB, list<C*> listOfC) {
  list<A*> l1;
  list<A*> l2;
  for (B* b : listOfB)
    l1.insert(b);
  for (C* c : listOfC)
    l2.insert(c);
  doSomething(l1, l2); //calling the function taking supertype
}

我尝试将list<B*>转换为list<A*>失败,我的猜测是由于模板专门化,编译器认为list<B*>list<A*>无关,但是B继承了a。

谁能确认一下,或者提出一个不同的方法来处理这个问题?

你的直觉(和juanchopanza的评论)是正确的——列表是完全不相关的类型。

选项为:

  1. 首先在任何地方使用list<A*>,即使你知道动态类型是B*C*
  2. list<A*>上写一个包装器,它可以从正确的动态类型转换为/转换为正确的动态类型-这相当于Java泛型中的(un)装箱行为
  3. doSomething重写为函数模板,其唯一的约束是类型是可转换的

    template <typename Sequence1, typename Sequence2>
    void doSomething(Sequence1 &x, Sequence2 &y) {
      // require only that *x.begin() is convertible with *y.begin(), etc.
    }
    

    我也同意Kerrek的建议,应该使用迭代器来代替,但这并没有显著改变类型要求——你只是得到两个迭代器类型参数,而不是两个容器类型参数