将基类向量传递给采用超类向量的函数
Pass a vector of baseclass to a function which takes vector of superclass
在我的代码中,我有一个 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>&
是。
在 c++ 中,Super
和 SubTypeA
类型的引用和指针是协变的,但 std::vector<Super>
和 std::vector<SubTypeA>
不是。您可以使用指针向量或对基 class 的引用来实现您想要的:
#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.
}
根据评论中的建议更新
在我的代码中,我有一个 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>&
是。
在 c++ 中,Super
和 SubTypeA
类型的引用和指针是协变的,但 std::vector<Super>
和 std::vector<SubTypeA>
不是。您可以使用指针向量或对基 class 的引用来实现您想要的:
#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.
}
根据评论中的建议更新