获取 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::any
或 boost::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<std::size_t>
可能比使用std::optional<int>
更好,因为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` 之间的区别