将 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> msgmsg 内存非常大,其中包含大量激光雷达点。 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(&copy);
    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(); });

Demo

删除器捕获原始shared_ptr以保持生命周期, 而不是释放资源,它只是“减少”引用计数。