获取 std::any 的大小

Get the size of std::any

本文关键字:any std 获取      更新时间:2023-10-16

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

你知道任何解决方案吗?

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

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

以牺牲额外的数据成员(存储大小(为代价,您也可以通过编写包装器来扩展std::any,如 Vittorio 的答案所示。

std::any不提供

对底层存储类型执行操作的任何方法T。但是,初始化/分配给std::any时,可以使用sizeof(T)之类的信息。

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

class my_any : std::any
{ 
    std::size_t _stored_size = 0;
public:
    template <typename T>
    my_any(T&&) : _stored_size{sizeof(std::decay_t<T>)} { }
    // ...
};