获取std :: any的大小

时间:2018-04-09 10:24:34

标签: c++ sizeof type-erasure stdany

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

你知道任何解决方案吗?

2 个答案:

答案 0 :(得分:3)

std::any未提供对基础存储类型T执行操作的任何方法。但是,初始化/分配给sizeof(T)时,std::any等信息可用。

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

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>)} { }

    // ...
};

答案 1 :(得分:3)

你不能获取std::any所持对象的大小(除了你提到的解决方法)。 std::any是类型擦除的 minimal 实现。

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

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