簡體   English   中英

可以使用std :: hash來散列函數指針嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM