![](/img/trans.png)
[英]convert from boost::shared_ptr<T> to boost::shared_ptr<const 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
。 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(©);
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.