我有课
Base
:
class Base
{
};
和派生类
Derived
:
class Derived: public Base
{
};
现在我需要获取派生指针的向量:
std::vector<std::shared_ptr<Derived>> derivedVec;
但不幸的是它们被存储为基指针向量,例如我只能访问向下转型的指针:
std::vector<std::shared_ptr<Base>> baseVec;
如何执行从
std::vector<std::shared_ptr<Base>>
到 std::vector<std::shared_ptr<Derived>>
的转换。希望解决方案是 C++20 风格。
首先,两个向量
std::vector<A>
和 std::vector<B>
不是协变的,这意味着将一个向量重新解释为另一个向量是不够的。要获得 std::vector<std::shared_ptr<Derived>>
,您需要转换向量:
#include <vector>
#include <memory>
#include <ranges>
// ...
std::vector<std::shared_ptr<Base>> base;
auto derived_view = base | std::views::transform([](const std::shared_ptr<Base> &b) {
// or use std::dynamic_pointer_cast for polymorphic classes
return std::static_pointer_cast<Derived>(b);
});
// If you don't need to create a new vector, but just want to examine the old one
// with the conversion applied, you can also skip this step and work with the view.
std::vector<std::shared_ptr<Derived>> derived(derived_view.begin(), derived_view.end());
// In C++23, you can also write:
std::vector<std::shared_ptr<Derived>> derived(std::from_range, derived_view);
// however, not every standard library supports this yet, at the time of writing
参见编译器资源管理器中的实时示例