2016-01-31 32 views
0

我想創建一個自定義類型的哈希,我已經看到了,我必須寫類似爲什麼我們需要額外的()在std :: hash <sometype>()(somevalue)?

template <> 
struct hash<MyClass> 
{ 
    std::size_t operator()(const MyClass& key) const 
    { 
    return std::hash<int>()(key.getID()); 
    } 
}; 

代碼工作,但我不understant爲什麼我必須寫

std::hash<int>()(key.getID()); 

而不是

std::hash<int>(key.getID()); 

中間()運算符是什麼意思?我使用的是Visual Studio 2013,我試圖看到std::hash的源代碼,但我不夠好,不能很好地理解它...

回答

9

std::hash<int>是一種類型。 std::hash<int>()是該類型的一個對象。 std::hash<int>()(key.getID());在該對象上調用operator()

可能更容易理解,如果對象是不是暫時的:

std::hash<int> x; 
auto h = x(key.getID()); 
+1

或通過'自動X =標準::哈希(); auto h = x(key.getID());'更明顯的是第二個語句中的'x'可以被替換爲'std :: hash ()'。 – Pixelchemist

+0

謝謝。所以我的錯誤假設哈希定義爲模板函數而不是類型。 – Jepessen

+0

@Jepessen我想是的。 'struct whatever {...};'''whatever'是一種類型(或者是一個類型的模板,如果前面有'tempate ' – juanchopanza

相關問題