C++ 获取std::any的大小

C++ 获取std::any的大小,c++,sizeof,type-erasure,stdany,C++,Sizeof,Type Erasure,Stdany,是否有任何方法可以获取由std::any存储的数据的大小(以字节为单位)?我提出的唯一解决方法是通过std::any::type查询其值的类型,并将结果与已知类型列表进行比较,如my_any.type()==typeid(T),然后大小为sizeof(T)。不幸的是,这种解决方案只有在事先知道类型的情况下才有效 您知道任何解决方案吗?std::any不提供对底层存储类型T执行操作的任何方法。但是,初始化/分配到std::any时,可以使用sizeof(T)等信息 一种可能的解决方案是围绕std:

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


您知道任何解决方案吗?

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

    // ...
};
class my\u any:std::any
{ 
std::size\u t\u storage\u size=0;
公众:
模板
my_any(T&):_存储的_大小{sizeof(std::decation_T)}{
// ...
};

您无法获得
std::any所持有对象的大小(您提到的解决方法除外)<代码>标准::any
是类型擦除的最小实现

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


您还可以通过编写包装来扩展
std::any
,但需要额外的数据成员(用于存储大小),正如维托里奥的建议。

使用
std::optional
可能比
std::optional
更好,因为
sizeof
给出了类型
std::size\u t
的结果。为什么我们需要
std::optional
?我们能用纯的吗?@DeanSeo
std::size\u t
。@Dean似乎对我来说也是一个更好的选择。@Dean如果any是空的怎么办?那么大小可以是0否?保存一个布尔值,对齐后不是空的。这个问题很清楚,问得很好,不管评论如何,不值得这样的否决投票。(给出对
any::size()
的需求并不能大大改善这个问题,它可能有助于公开。)