将 const std::shared_ptr<const T> 转换为 boost::shared_ptr<T>
convert const std::shared_ptr<const T> into boost::shared_ptr<T>
我需要将 const std::shared_ptr<const T>
的变量类型转换为 boost::shared_ptr<T>
。
在下面的scanCallback()
中,我不能修改参数const std::shared_ptr<const io_adaptor::msg::PandarScan> msg
。 msg
内存非常大,其中包含大量激光雷达点。 PushScanPacket()
func 的arg 是boost::shared_ptr<io_adaptor::msg::PandarScan>
,我也不能修改它的类型。
下面的代码没有编译成功,有人知道怎么办吗?
void HesaiLidarModule::scanCallback(
const std::shared_ptr<const io_adaptor::msg::PandarScan> msg){
std::remove_const<const std::shared_ptr<
const io_adaptor::msg::PandarScan>
>::type non_const_msg(msg);
boost::shared_ptr<io_adaptor::msg::PandarScan> msg_boost(non_const_msg.get());
hsdk->PushScanPacket(msg_boost);
}
UPDATE_1st: 下面的代码可以编译成功,但是我不确定std::remove_const<const io_adaptor::msg::PandarScan>::type non_const_obj(*msg);
是否会引入复制操作符,这对msg
来说是昂贵的。
void HesaiLidarModule::scanCallback(
const std::shared_ptr<const io_adaptor::msg::PandarScan> msg){
std::remove_const<const io_adaptor::msg::PandarScan>::type non_const_obj(*msg);
io_adaptor::msg::PandarScan& copy = non_const_obj;
boost::shared_ptr<io_adaptor::msg::PandarScan> msg_boost(©);
hsdk->PushScanPacket(msg_boost);
}
您不能将所有权从 std::shared_ptr
转移到 boost::shared_ptr
。
不过你可能来自 std::unique_ptr
。
但您可以使用自定义删除器创建 boost::shared_ptr
。
boost::shared_ptr<io_adaptor::msg::PandarScan>
msg_boost(const_cast<io_adaptor::msg::PandarScan*>(msg.get()),
[msg = msg](auto*) mutable { msg.reset(); });
删除器捕获原始shared_ptr
以保持生命周期,
而不是释放资源,它只是“减少”引用计数。
我需要将 const std::shared_ptr<const T>
的变量类型转换为 boost::shared_ptr<T>
。
在下面的scanCallback()
中,我不能修改参数const std::shared_ptr<const io_adaptor::msg::PandarScan> msg
。 msg
内存非常大,其中包含大量激光雷达点。 PushScanPacket()
func 的arg 是boost::shared_ptr<io_adaptor::msg::PandarScan>
,我也不能修改它的类型。
下面的代码没有编译成功,有人知道怎么办吗?
void HesaiLidarModule::scanCallback(
const std::shared_ptr<const io_adaptor::msg::PandarScan> msg){
std::remove_const<const std::shared_ptr<
const io_adaptor::msg::PandarScan>
>::type non_const_msg(msg);
boost::shared_ptr<io_adaptor::msg::PandarScan> msg_boost(non_const_msg.get());
hsdk->PushScanPacket(msg_boost);
}
UPDATE_1st: 下面的代码可以编译成功,但是我不确定std::remove_const<const io_adaptor::msg::PandarScan>::type non_const_obj(*msg);
是否会引入复制操作符,这对msg
来说是昂贵的。
void HesaiLidarModule::scanCallback(
const std::shared_ptr<const io_adaptor::msg::PandarScan> msg){
std::remove_const<const io_adaptor::msg::PandarScan>::type non_const_obj(*msg);
io_adaptor::msg::PandarScan& copy = non_const_obj;
boost::shared_ptr<io_adaptor::msg::PandarScan> msg_boost(©);
hsdk->PushScanPacket(msg_boost);
}
您不能将所有权从 std::shared_ptr
转移到 boost::shared_ptr
。
不过你可能来自 std::unique_ptr
。
但您可以使用自定义删除器创建 boost::shared_ptr
。
boost::shared_ptr<io_adaptor::msg::PandarScan>
msg_boost(const_cast<io_adaptor::msg::PandarScan*>(msg.get()),
[msg = msg](auto*) mutable { msg.reset(); });
删除器捕获原始shared_ptr
以保持生命周期,
而不是释放资源,它只是“减少”引用计数。