[英]Can std::hash be used to hash function pointers?
可以使用C ++ 11 std::hash
類型來散列函數指針嗎? hash
部分特化定義為
template <typename T> struct hash<T*>;
但由於函數指針與C ++中的其他指針類型不同(例如它們不能轉換為void*
),我不確定將它用於int(*)()
或void(*)(int, int)
等類型是否安全void(*)(int, int)
。
這是允許的嗎? 新的ISO規范中是否有任何特定的措辭支持或駁斥這一點?
謝謝!
好問題。 我肯定不知道答案,我很樂意推薦給比我更有知識的人,但我的想法是,即使函數指針與數據指針不同,它們仍然是指針:所以應該應用std::hash<T*>
部分特化。
對於它的價值,以下編譯沒有警告,即使在g ++ 4.8.1和clang 3.3中使用-pendantic
,並按預期工作:
#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;
}
我真的很感興趣,如果有人有任何參考標准來支持這一點。
我找到了以下內容:
17.6.3.4哈希要求
如果出現以下情況,H類型符合Hash要求:
- 它是一個函數對象類型(20.8)
[...]
然后,引用的20.8狀態:
函數對象類型是對象類型(3.9),它可以是函數調用中的postfix-expression的類型(5.2.2,13.3.1.1).228函數對象是函數對象類型的對象。 在人們期望將指向函數的指針傳遞給算法模板的地方(第25條),接口被指定為接受函數對象。 這不僅使算法模板與函數指針一起使用,而且使它們能夠使用任意函數對象。
它有點向后陳述......但聲明不僅使算法模板與函數指針一起工作......似乎適合你的問題。
這真的很有趣......我在使用MSVC ++時碰到了這個問題。 我想要做的是:
static std::unordered_map<Fun, std::string> FunctionMap()
{
static std::unordered_map<Fun, std::string> map;
return map;
}
用Fun函數指針類型。
在編譯期間,我收到以下錯誤:
error C2338: The C++ Standard doesn't provide a hash for this type.
....
_Kty=int (__thiscall Testje::* )(int,int)
在之前的嘗試中,我嘗試將函數指針強制轉換為void*
,這是不允許的,也不會編譯(請參閱: https : //isocpp.org/wiki/faq/pointers-to-members#cant-cvt- memfnptr-to-voidptr了解詳情)。 原因是void *是數據指針,而函數指針是代碼指針。
到目前為止我的結論是它是不允許的,它不會在MSVC ++上編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.