我有一些类似以下的类型:
struct Order_t;
using SpOrder_t = std::shared_ptr<Order_t>;
using CpOrder_t = std::shared_ptr<const Order_t>;
using SomeOrders_t = std::vector<SpOrder_t>;
using ConstOrders_t = std::vector<CpOrder_t>;
我想直接从
SomeOrders_t
分配到 ConstOrders_t
,但编译器说这些是不同的类型:
SomeOrders_t _cur_ords;
ConstOrders_t TradingOrders() {
return _cur_ords;
};
有没有可以直接赋值的方法? 或者我必须用循环来完成,然后将它们一一分配?
如果
T
是具有一个类型参数的模板,并且 u
和 v
是不同的类型,则 T<u>
和 T<v>
是不同(且不相关)的类型。u
到 v
的隐式转换,也没有(默认)从 T<u>
到 T<v>
的隐式转换。std::shared_ptr
具有转换构造函数和赋值,可以从 shared_ptr<Order_t>
转换为 shared_ptr<const Order_t>
,这使得它们的行为类似于 Order_t*
和 const Order_t*
。)
使转换显式化非常简单:
ConstOrders_t TradingOrders() {
return { _cur_ords.begin(), _cur_ords.end() };
};
shared_ptr
的定义声明为:
template<class T>
std::shared_ptr<T>
将
T
定义为 const _T
或 _T
会生成两种不同的类型(如果您想了解它是如何工作的,请查看此 文档),但您实际上可以通过使用 static_pointer_cast
进行转换来更改类型。在你的情况下,它看起来像:
SomeOrders_t _cur_ords;
ConstOrders_t TradingOrders() {
return static_pointer_cast<const Order_T>(_cur_ords);
};