![](/img/trans.png)
[英]Should I check boost::shared_ptr or std::shared_ptr before I use it?
[英]should I use std::any for std::shared_ptr<void>?
我有幾個producers
和一個consumer
持有一個queue
,當生產者產生一個 object 時,它將它包裝成一個shared_ptr
並發送到消費者隊列進行處理,因為不同的生產者可能產生不同類型的 object,所以隊列定義為
struct FrameHeader {
int data_type;
};
class Frame {
private:
std::shared_ptr<FrameHeader> header;
std::shared_ptr<void> body;
public:
Frame(const std::shared_ptr<FrameHeader> header, const std::shared_ptr<void> body);
std::shared_ptr<FrameHeader> get_header();
std::shared_ptr<void> get_body();
};
std::deque<std::shared_ptr<Frame>> data_q;
當我從data_q
彈出一個Frame
時,我查看header
中的data_type
字段來決定我應該將body
投射到哪個 object
可能的問題是c++17
我了解到有一個名為std::any
的新功能,我可以使用它來保存任何 object,我應該像這樣使用any
代替shared_ptr<void>
嗎?
class Frame {
private:
std::shared_ptr<FrameHeader> header;
any body;
public:
Frame(const std::shared_ptr<FrameHeader> header, const std::shared_ptr<void> body);
std::shared_ptr<FrameHeader> get_header();
any get_body();
};
...
auto real_obj_ptr = any_cast<shared_ptr<RealClass>>(frame.get_body());
另外是否有更好的方法來處理這種情況?
std::any
不會替代std::shared_ptr
,反之亦然:它們有不同的用途。
每當您需要跟蹤 object 的生命周期時使用共享指針,並在最后一個引用被銷毀時將其刪除。 這是顯而易見的。 std::any
不會那樣做。 另一方面, std::any
可以保留對任何 object 的引用,並且比使用void*
的任何技巧都更安全( stared_ptr<void>
就是其中之一)。 從技術上講,您可以將兩者結合起來:
std::any a = std::make_shared<int>(42);
std::cout << *std::any_cast<std::shared_ptr<int>>(a);
這種方法有一個缺點,即std::any
在堆上分配對象,因為它無法提前知道所存儲類型的最大大小。 如果可以限制存儲類型的數量,則可以使用更高效、更安全的模式: std::variant
。
實際上有很多模式可以使用,它們各有利弊。 例如,您可以將公共基數 class 與std::shared_ptr<Base>
一起使用。 您可以使用雙重調度來進行更安全的類型擦除。 除了你,沒有人知道你的任務,所以盡量詳細描述你遇到的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.