将基类向量传递给接受超类向量的函数
Posted
技术标签:
【中文标题】将基类向量传递给接受超类向量的函数【英文标题】:Pass a vector of baseclass to a function which takes vector of superclass 【发布时间】:2017-11-08 09:31:42 【问题描述】:在我的代码中,我有一个SuperType
,它有两个子类型......现在我有一个std::vector<SubTypeA>&
,需要将它传递给一个函数,该函数迭代向量并调用只来自SuperType
的函数...我需要对这两种子类型执行此操作。
(超类型还不是虚拟的,但我需要在某个时候将其变为虚拟,因为它只是两个子类型的公共部分,不能有它的实例)
这是一个最小(非)工作示例:
#include <vector>
struct Super
// stuff and functions
;
struct SubTypeA : public Super
// stuff and functions
;
void func(const std::vector<Super>& sup)
for (auto& elem: sup)
// do things
return;
int main()
std::vector<SubTypeA> v; // I get this from another place
std::vector<SubTypeA>& my_variable = v; // this is what I have in my code
func(my_variable); // does not work.
传递迭代器也是一种解决方案。
旁注:我从另一种类型获得my_variable
:
struct SomeContainer
std::vector<SubTypeA> a;
std::vector<SubTypeB> b;
我不想更改容器,所以std::vector<SubTypeA>&
是。
【问题讨论】:
std::vector<Super>
与std::vector<SubTypeA>
是不同的类型,由于object slicing 的原因,无法无损地从一种转换为另一种。
How to pass a vector of a Child class in to a function expecting a vector of Parent class?的可能重复
【参考方案1】:
在 C++ 中,Super
和 SubTypeA
类型的引用和指针是协变的,但 std::vector<Super>
和 std::vector<SubTypeA>
不是。您可以使用指针向量或对基类的引用来实现您想要的:
#include <vector>
struct Super
// stuff and functions
;
struct SubTypeA : public Super
// stuff and functions
;
void func(std::vector<std::reference_wrapper<Super>>& sup)
for (Super& elem: sup)
// do things
return;
int main()
std::vector<SubTypeA> v; // I get this from another place
// using vector of references to base class
std::vector<std::reference_wrapper<Super>> my_variable(v.begin(), v.end());
func(my_variable); // does not work.
按照 cmets 的建议更新
【讨论】:
或者您可以将func
设为接受开始/结束迭代器的模板。
std::vector
有一个接受一对迭代器的 c'tor。使用它会比编写一个原始循环更短。
另外,std::reference_wrapper
也可以隐式转换为引用。所以也许for (Super& ref: sup)
再次简洁。以上是关于将基类向量传递给接受超类向量的函数的主要内容,如果未能解决你的问题,请参考以下文章