如何解决我应该对std :: shared_ptr <void>使用std :: any吗?
我有几个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
投射到哪个对象
可能是关于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
。
实际上,有很多可用的模式,它们各有利弊。例如,您可以将公共基类与std::shared_ptr<Base>
一起使用。您可以使用双重调度来更安全地擦除类型。除了您之外,没人知道您的任务,因此请尝试详细描述您遇到的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。