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

And*_*son 5 c++ hash unordered-set c++11 std-function

我需要创建一个模板化的类,该类可以容纳指向类型元素的指针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);
    }
};
Run Code Online (Sandbox Code Playgroud)

我并不完全愿意使用std::unordered_set,但是它似乎提供了使此代码段(以及我的代码的其余部分)正常运行所需的一切。

我在想这个错误的方式吗?散列a完全不可能std::function吗?

Joh*_*han 3

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

所以我不认为在这里使用一个函数有什么意义...你将拥有你的函数并将它们存储在集合中,然后呢?你只是迭代它们?

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

因此,即使您找到一种从函数生成哈希的方法,您也会被卡住......而且我不知道如何满足哈希要求。

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