如何在 std::vector 之间直接分配那些仅具有不同常量的元素?

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

我有一些类似以下的类型:

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;
};

有没有可以直接赋值的方法? 或者我必须用循环来完成,然后将它们一一分配?

c++ iteration constants shared-ptr qualifiers
2个回答
0
投票

如果

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() };
};

-2
投票

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);
};
© www.soinside.com 2019 - 2024. All rights reserved.