获取 std::any 的大小
Get the size of std::any
有没有办法获取std::any
存储的数据的大小(以字节为单位(?我想出的唯一解决方法是通过std::any::type
查询其值的类型,并将结果与已知类型列表(如 my_any.type() == typeid(T)
(进行比较,然后大小为 sizeof(T)
。不幸的是,此解决方案仅在事先知道类型时才有效。
你知道任何解决方案吗?
您无法获取std::any
持有的对象的大小(除了您提到的解决方法(。 std::any
是类型擦除的最小实现。
如果你想要更强大的东西,自己写(这并不难,只需在std::any
或boost::any
上建模并添加size()
功能(。您可能还想添加到any
中,例如I/O,将多个数据(或任何容器的内容(存储为数组等。
以牺牲额外的数据成员(存储大小(为代价,您也可以通过编写包装器来扩展std::any
,如 Vittorio 的答案所示。
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>)} { }
// ...
};
相关文章:
- 哪些类型可以转换为std::any
- 引用 std::any 或 not_yet_in_std::whatever 的惯用方式是什么?
- std::is_reference from std::any
- 是否可以从 std::any 创建 std::any 与 std::reference_wrapper?
- 使用 std::map 存储在 std::any 中,然后通过 std::any_cast 访问
- 可以有效地转换 std::any 与 std::any_cast
- 避免使用 std::any 编写相同的重复类型检查代码
- 广义 std::function (std::any 表示可调用对象)
- 在VS2015中访问std::any
- std::any 跨共享库边界在 mingw 中
- 是否可以使用 std::vector<std::any> vec;这将导致异构数据类型
- 将特定指针强制转换为 std::any 指针
- 如何将带有"any"枚举的 std::map 传递给函数
- 检查 std::any 变量是否包含 std::string 时出现问题
- 获取 std::any 的大小
- “boost::any”和“std::any”之间的区别
- C++ std::variant vs std::any
- 是否可以将两个任意函数与 C++17 中的 std::any 进行比较
- 从 C 字符串构造 boost::type_erasure::any,但存储为 std::string
- 确实 boost::any / std::any 将小对象存储到位