可以使用std :: hash来散列函数指针吗?

tem*_*def 20 c++ hash pointers c++11 stdhash

可以使用C++ 11 std::hash类型来散列函数指针吗?有一个hash部分专业化定义为

template <typename T> struct hash<T*>;
Run Code Online (Sandbox Code Playgroud)

但由于函数指针与C++中的其他指针类型不同(例如它们无法转换为void*),我不确定将它用于类似int(*)()或类型的类型是否安全void(*)(int, int).

这是允许的吗?新ISO规范中是否有任何特定的措辞支持或驳斥这一点?

谢谢!

Tri*_*dle 11

好问题.我肯定不知道答案,我很乐意推荐给比我更了解的人,但我的想法是,即使函数指针与数据指针不同,它们仍然是指针:所以std::hash<T*>应该应用部分专业化.

对于它的价值,即使-pendantic在g ++ 4.8.1和clang 3.3中,以下编译也没有警告,并按预期工作:

#include <functional>
#include <iostream>

void func1(int) {}
void func2(int) {}

int main()
{
    typedef void (*func_type) (int);

    std::hash<func_type> hash;

    std::cout << hash(func1) << std::endl;
    std::cout << hash(func2) << std::endl;

}
Run Code Online (Sandbox Code Playgroud)

我真的很感兴趣,如果有人有任何参考标准来支持这一点.

  • 标准中没有任何内容表示`hash <T*>`_doesn't_适用于任何指针类型,因此它适用.具体来说,它适用于任何"指向`void`的指针或给定类型的对象或函数(包括类的静态成员)"([basic.compound]中给出的不同类型的指针) (7认同)