gpt4 book ai didi

c++ - 我应该对 std::shared_ptr 使用 std::any 吗?

转载 作者:行者123 更新时间:2023-12-02 09:59:21 28 4
gpt4 key购买 nike

我有几个 producers和一个 consumer其中持有 queue ,当生产者产生一个对象时,它将它包装成一个shared_ptr并发送到消费者队列进行处理,因为不同的生产者可能产生不同类型的对象,所以队列定义为

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;
当我弹出 Frame来自 data_q ,我查看 data_type header 中的字段决定我应该转换哪个对象 body进入
5 月的问题是 c++17我了解到有一个名为 std::any 的新功能。我可以用来固定任何物体,我应该使用 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反之亦然:它们有不同的目的。
每当您需要跟踪对象的生命周期并在最后一个引用被销毁时将其删除时,都会使用共享指针。这是显而易见的。 std::any不这样做。另一方面std::any可以保留对任何对象的引用,并且比使用 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 .
实际上有很多模式可以使用,它们各有优缺点。例如,您可以将公共(public)基类与 std::shared_ptr<Base> 一起使用。 .您可以使用双重调度来进行更安全的类型删除。除了您之外,没有人知道您的任务,因此请尝试详细描述您遇到的问题。

关于c++ - 我应该对 std::shared_ptr<void> 使用 std::any 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63478796/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com