簡體   English   中英

轉換 const std::shared_ptr<const t> 進入 boost::shared_ptr<t></t></const>

[英]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 memory 中的msg非常大,其中包含大型激光雷達點。 PushScanPacket()函數的參數是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(); });

演示

Deleter 捕獲原始shared_ptr以維持生命周期,而不是釋放資源,它只是“減少”引用計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM