gpt4 book ai didi

c++ - 从 shared_ptr 到 weak_ptr 多态性的转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:23 25 4
gpt4 key购买 nike

我很难解决这个问题。假设我有这个 vector

std::vector<std::shared_ptr<Car>> cars; 

Car 是一个抽象类。我希望能够返回不同类型的弱指针,所以我执行以下操作。

template<typename T>
std::weak_ptr<T> GetCar()
{
for (std::vector<std::shared_ptr<Car>>::iterator it = cars.begin(); it != cars.end(); ++it)
{
T* derived = dynamic_cast<T*>((*it).get());
if (derived != nullptr)
{
std::weak_ptr<T> carPointer = *it;
return carPointer;
}
}
return std::weak_ptr<T>();
}

但是当我尝试将函数与继承自 Car 的类一起使用时,出现以下错误。 Error C2440 'initializing': cannot convert from 'std::shared_ptr<Car>' to 'std::weak_ptr<Saab>'
要求时可能没有有效的汽车。我尝试使用 boost::optional 但它不处理多态性。如果我不能让它工作,我可能会使用原始指针。

最佳答案

你不能直接构建你的 weak_ptr<Saab>来自 shared_ptr<Car>因为模板参数 Car必须隐式转换为 Saab为了工作。

但您可以先转换您的 shared_ptr<Car>shared_ptr<Saab>首先构建你的 weak_ptr之后。在下面的示例中,我使用了 std::dynamic_pointer_cast去做。

这是我想出的:

#include <iostream>
#include <vector>
#include <memory>

struct Car
{
virtual void name() = 0;
};

struct Saab : Car
{
virtual void name() { std::cout << "Saab" << std::endl; }
};

struct Renault : Car
{
virtual void name() { std::cout << "Renault" << std::endl; }
};

template<typename T>
std::weak_ptr<T> GetCar(std::vector<std::shared_ptr<Car>> cars)
{
for (std::vector<std::shared_ptr<Car>>::iterator it = cars.begin(); it != cars.end(); ++it)
{
auto derived = std::dynamic_pointer_cast<T>(*it);
if (derived != nullptr)
{
std::weak_ptr<T> carPointer(derived);
return carPointer;
}
}
return std::weak_ptr<T>();
}

int main()
{
std::vector<std::shared_ptr<Car>> cars;
cars.push_back(std::make_shared<Saab>());
cars.push_back(std::make_shared<Renault>());

auto wp = GetCar<Saab>(cars);

auto sp = wp.lock();
if (sp)
{
sp->name();
}

auto wp2 = GetCar<Renault>(cars);

auto sp2 = wp2.lock();
if (sp2)
{
sp2->name();
}

}

打印出来:

Saab

Renault

Coliru 链接:http://coliru.stacked-crooked.com/a/9dbb85b556b83597

关于c++ - 从 shared_ptr 到 weak_ptr 多态性的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38237789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com