c++ - 将 list<A*> 转换为 list<B*> ,其中 B 继承 A

标签 c++ templates stl casting containers

我有一个函数

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 泛型中的(非)装箱行为
  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 的建议,即应该使用迭代器来代替,但这并没有显着改变类型要求——你只是得到两个迭代器类型参数而不是两个容器类型参数

关于c++ - 将 list<A*> 转换为 list<B*> ,其中 B 继承 A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24776520/

相关文章:

c++ - 在 C++ MFC 应用程序中模拟应用程序内部的键盘输入

c++ - 为什么 std::vector 和 std::array 的 C++ initializer_list 行为不同?

algorithm - STL和.net基础库默认搜索用的是哪种排序算法?

c++ - 从函数返回 STL 容器

c++ - 为对象创建 "thin"结构包装器的正确方法是什么?

c++ - 设置小部件初始大小

c++ - 使用模板对象的模板函数中无法识别的内容

c++ - 如何分配子类的方法成员指针?

c++ - 选择模板化运算符实现

c++ - 无法将 libpcrecpp 链接到 MinGW