获取 std::any 的大小

Get the size of std::any

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

你知道解决办法吗?

std::any 不提供对基础存储类型 T 执行操作的任何方式。但是,当 initializing/assigning 到 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>)} { }

    // ...
};

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

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

以额外的数据成员(存储大小)为代价,您还可以通过编写包装器来扩展 std::any,如 Vittorio 的 .

中所建议的