获取 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::any
或 boost::any
上建模并添加 size()
功能即可)。
any
还有很多其他的东西你可能想要添加,比如 I/O,将多个数据(或任何容器的内容)存储为数组等。
以额外的数据成员(存储大小)为代价,您还可以通过编写包装器来扩展 std::any
,如 Vittorio 的 .
中所建议的
有什么方法可以得到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::any
或 boost::any
上建模并添加 size()
功能即可)。
any
还有很多其他的东西你可能想要添加,比如 I/O,将多个数据(或任何容器的内容)存储为数组等。
以额外的数据成员(存储大小)为代价,您还可以通过编写包装器来扩展 std::any
,如 Vittorio 的