获取 std::any 的大小

Posted

技术标签:

【中文标题】获取 std::any 的大小【英文标题】:Get the size of std::any 【发布时间】:2018-04-09 10:24:33 【问题描述】:

有什么方法可以获取std::any存储的数据大小(以字节为单位)?我想出的唯一解决方法是通过std::any::type 查询其值的类型并将结果与​​my_any.type() == typeid(T) 等已知类型的列表进行比较,然后大小为sizeof(T)。不幸的是,这种解决方案只有在预先知道类型时才有效。

你知道有什么解决办法吗?

【问题讨论】:

这个问题很清楚,问得很好,不管 cmets 是什么,不值得这样的反对票。 (提供any::size() 的需求并不能大大改善问题,这可能有助于暴露XY problems。) 【参考方案1】:

您无法获取std::any 持有的对象的大小(您提到的解决方法除外)。 std::any 是类型擦除的最小实现。

如果您想要更强大的功能,请自己编写(不难,只需在 std::anyboost::any 上建模并添加 size() 功能)。 您可能还想向any 添加许多其他内容,例如 I/O、将多个数据(或任何容器的内容)存储为数组等。

按照 Vittorio 的 answer 中的建议,您还可以通过编写包装器来扩展 std::any,但代价是额外的数据成员(用于存储大小)。

【讨论】:

【参考方案2】:

std::any 不提供对底层存储类型T 执行操作的任何方式。然而,像 sizeof(T) 这样的信息在初始化/分配给 std::any 时可能是可用的。

一种可能的解决方案是围绕std::any 创建自己的包装器,以跟踪大小。例如

class my_any : std::any
 
    std::size_t _stored_size = 0;

public:
    template <typename T>
    my_any(T&&) : _stored_sizesizeof(std::decay_t<T>)  

    // ...
;

【讨论】:

使用std::optional&lt;std::size_t&gt; 可能比使用std::optional&lt;int&gt; 更好,因为sizeof 给出了std::size_t 类型的结果。 为什么我们需要std::optional?我们可以只使用纯std::size_t吗? @DeanSeo std::size_t 对我来说似乎也是一个更好的选择。 @Dean 如果任何为空怎么办? 那么size可以为0不是吗?保存一个布尔值,对齐后它不是什么都没有。

以上是关于获取 std::any 的大小的主要内容,如果未能解决你的问题,请参考以下文章

是否可以仅从 std::any 使用 std::reference_wrapper 创建 std::any?

`boost::any` 和 `std::any` 之间的区别

为啥在 dlopen'd 函数中传递的 std::any 的 std::any_cast 会引发错误

我啥时候应该使用 std::any

std::any - 为啥它缺少这么多运算符?

为啥 std::any 没有 unsafe_any_cast?