我有一个函数
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 的评论)是正确的 - 这些列表是完全不相关的类型。
选项是:
- 使用
list<A*>
首先到处都是,即使你知道动态类型是B*
或C*
- 在
list<A*>
上写一个包装器转换为正确的动态类型/从正确的动态类型转换 - 这相当于 Java 泛型中的(非)装箱行为 重写
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/