从shared_ptr到weak_ptr多态性的转换
Conversion from shared_ptr to weak_ptr polymorphism
我很难解决这个问题。假设我有这个向量
std::vector<std::shared_ptr<Car>> cars;
汽车是一个抽象类。我希望能够返回不同类型的弱指针,因此我执行以下操作。
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::可选,但它不处理多态性。如果我不能让它工作,我可能会使用原始指针。
不能
直接从shared_ptr<Car>
构造weak_ptr<Saab>
,因为模板参数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();
}
}
它打印出来:
萨博
雷诺
科里鲁链接 : http://coliru.stacked-crooked.com/a/9dbb85b556b83597
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 从const ptr*转换为ptr*时出现问题
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 将 lamba 隐式转换为函数 ptr 以创建类
- 为什么非常量ptr不能隐式地将ptr转换为常量作为模板中的参数
- C++双PTR到长PTR转换
- 无法将 Uchar PTR 转换为 OpenCVsharp
- 不能动态强制转换为ptr
- 函数PTR转换为带模板参数的函数
- 将派生类的ptr类型转换为ptr类型
- 将输入字符串转换为字符* <错误 Ptr>