定义 std::hash<std::function>

Define std::hash<std::function>

本文关键字:std function gt lt 定义 hash      更新时间:2023-10-16

我需要创建一个模板化类,该类可以保存指向T类型元素的指针,然后对它们执行函数。函数将来自不同的地方,所以我需要一个容器来存储它们,这样我以后可以调用它们。我决定使用std::unordered_set,因为它提供了速度并限制了重复,因为它是作为哈希表实现的。我已经编写了一个完整的类,但它没有编译,因为没有为我的std::function定义哈希函数,该函数接受类型为T的指针并返回void。对于我使用的每种类型,用struct hash<std::function<void(MyCustomType*)>>(以及重载()运算符)来指定它很容易,但我如何实际散列函数呢?

以下是我与相关成员和方法的课堂摘录:

template <typename T>
class Master {
private:
std::unordered_set<std::function<void(T*)>> functions;
protected:
registerFunction(std::function<void(T*)> function) {
this->functions.insert(function);
}
unregisterFunction(std::function<void(T*)> function) {
this->functions.erase(function);
}
};

我并不完全倾向于使用std::unordered_set,但它似乎提供了使这篇文章(以及我的其余代码)正常工作所需的一切。

我是不是想错了?是否完全不可能散列std::function

集合主要是检查数据是否在其中的东西。

所以我不认为在这里使用一个有什么意义。。。你会有你的函数,你会把它们存储在集合中,然后呢?你只是重复它们?

对于您的问题,集合的元素应该有一种生成哈希和operator==()的方法。第二个没有为std::function提供,因此您将无法检查您的函数是否真的在集合中。

因此,即使你找到了从函数生成哈希的方法,你也会陷入困境。。。我不知道如何满足散列要求。

为什么不简单地使用std::vector呢?