【发布时间】:2014-07-16 09:00:42
【问题描述】:
我有一个函数
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。
有人可以确认这一点,或者用不同的方法来解决这个问题吗?
【问题讨论】:
-
没错。它们是不同的类型,它们之间没有转换机制。
-
您应该将列表声明为
list<A*>,无论您使用B*还是C*填充它,您都将其作为参数传递。对于多态类型,无论实际类型如何,始终使用基指针/引用。 -
说我疯了,但我只想把它做成一个函数模板。
-
重写你的算法,让它们根据迭代器而不是容器工作?
-
您可以通过 iterator-constructor 构造这些临时列表,但我个人更倾向于修改
doSomething以仅采用四个 iteratoro 参数。如果 B 和 C 从 A 继承,那么(*it)->Asomething(),其中Asomething是A的成员(因此B和C)可能是一个合理的解决方案。
标签: c++ templates stl casting containers