4

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

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

4

2 回答 2

6

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_size{sizeof(std::decay_t<T>)} { }

    // ...
};
于 2018-04-09T10:34:54.813 回答
6

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

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

以额外的数据成员(存储大小)为代价,您还可以std::any通过编写包装器来扩展,如 Vittorio 的回答中所建议的那样。

于 2018-04-09T10:35:02.943 回答