基共享指针向量到派生共享指针向量

问题描述 投票:0回答:1

我有课

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 风格。

c++ c++20 stdvector smart-pointers
1个回答
0
投票

首先,两个向量

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

参见编译器资源管理器中的实时示例

© www.soinside.com 2019 - 2024. All rights reserved.