我需要创建一个模板化的类,它可以保存指向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
是完全不可能的吗?
答案 0 :(得分:3)
大多数情况下你会检查数据是否在其中。
所以我没有看到在这里使用它的意义......你将拥有你的功能,你将它们存储在集合中,然后,什么?你只是迭代它们?
对于您的问题,集合的元素应该有一种生成哈希和operator==()
的方法。第二个没有为std::function
提供,因此您无法检查您的功能是否真的在集合中。
所以,即使你找到了一种从函数生成哈希的方法,你也会陷入困境......我不知道如何满足hash的要求。
为什么不简单地使用std::vector
?