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
?我们能用纯的吗?@DeanSeostd::size\u t
。@Dean似乎对我来说也是一个更好的选择。@Dean如果any是空的怎么办?那么大小可以是0否?保存一个布尔值,对齐后不是空的。这个问题很清楚,问得很好,不管评论如何,不值得这样的否决投票。(给出对any::size()
的需求并不能大大改善这个问题,它可能有助于公开。)