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

时间:2013-12-19 22:17:46

标签: c++ c++11 hash std-function unordered-set

我需要创建一个模板化的类,它可以保存指向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是完全不可能的吗?

1 个答案:

答案 0 :(得分:3)

大多数情况下你会检查数据是否在其中。

所以我没有看到在这里使用它的意义......你将拥有你的功能,你将它们存储在集合中,然后,什么?你只是迭代它们?

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

所以,即使你找到了一种从函数生成哈希的方法,你也会陷入困境......我不知道如何满足hash的要求。

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