来自 std::any 的足够散列

问题描述

在 C++ 中是否有足够的方法从 std::any 存储的数据中提取散列? 好吧,或者至少是一个字节列表形式的对象及其长度

解决方法

std::any 是一种类型安全机制,用于将已知类型的对象从一个位置传递到另一个位置,通过不需要知道该类型是什么的中介。从中计算散列不是它的目标。事实上,在不影响 any 的功能的情况下,这是不可能实现的。

散列一个对象需要了解该对象正在做什么和正在做什么。假设您可以只查看对象表示的字节,从而从中计算出有意义的散列,结果不会很好。它可能看起来工作......一段时间。但最终,它会做错事。

您可以创建一个类似于 any 的类型擦除类型,它需要对象实现散列。但是 std::any 不是那种类型,因为任何不想要散列他们放入 any 的类型的人将无法将所述对象存储在 any .

这是因为 any 提供的任何操作都是存储到 any 中的所有类型必须提供的操作。例如,any 是可复制的,因此 any 不能 存储仅移动类型。对于那些想要这样做的人来说,这是一个烦恼,并且您转储到 any 中的功能越多,该类型存储“任何”事物的能力就越受限制。