簡體   English   中英

我應該將 std::any 用於 std::shared_ptr<void> ?</void>

[英]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.

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