2016-12-20 57 views
0

我需要在教學貫徹C++ Hashtable類,所以我決定創建一個模板類:如何在C++中處理不同的模板參數?

template <typename key_t, typename value_t> 
class HashTable {}; 

在這種情況下,我需要哈希不同類型的密鑰。 我想類似的東西:

if(typeid(std::string) == typeid(_key)) { 
    return StrSum(_key) % TABLE_SIZE; 
} else { 
    return _key % TABLE_SIZE; 
} 

但在那typeid的()情況下,是不是編譯時間定義的函數,我的編譯器(MSVS)打我一個錯誤,」 ......不存在用於定義操作符%的std :: string」。

所以,我的問題是:我該怎麼做?

+0

做什麼標準['的std :: unordered_map'(http://en.cppreference.com/w/ cpp/container/unordered_map)確實提供了一個散列函數作爲默認的模板參數。作爲一個容器實現者,你不應該在編譯時推動可以運行的決策。特別是'typeid'的東西,這是臭名昭着的緩慢。 –

+0

該死的太晚了,回答我的評論。無論如何你都可以看到代碼[here](http://ideone.com/KmkxFR)。 hash_table實現只是演示的一種工具,顯然不適合正確使用。 –

回答

2

你可以使用重載:

void hash_impl(const std::string& x) 
{ 
    return StrSum(x) % TABLE_SIZE; 
} 

template <typename T> 
void hash_impl(const T& x) 
{ 
    return x % TABLE_SIZE; 
} 

if ... else可以到hash_impl(_key)呼叫所取代。


或者,你可以在C++ 17使用if constexpr(...)

if constexpr(std::is_same<std::decay_t<decltype(_key)>, std::string>{}) 
{ 
    return StrSum(_key) % TABLE_SIZE; 
} 
else 
{ 
    return _key % TABLE_SIZE; 
} 
+0

感謝您的建議,但現在我向您提出了一個新問題:如果我沒有字符串鍵,我該如何調用hash_impl。我的意思是,這樣調用:hash_impl(incomingKey)或hash_impl (incomingKey)? –

+0

'hash_impl(incomingKey)'會很好,因爲模板參數會被推導*(並且非模板函數將優先於模板函數)*。 –