2016-12-20 7 views
0

мне нужно impelement в hashTable класса в C++, поэтому я решил создать класс шаблона:Как я могу обрабатывать различные параметры шаблона в 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() не время компиляции определенной функции, мой компилятор (МСВС) ударять мне ошибку, что»... нет определенного оператора% для станд :: строка».

Итак, мой вопрос: как я могу это сделать?

+0

Делайте то, что стандарт [ 'станд :: unordered_map'] (http://en.cppreference.com/w/ cpp/container/unordered_map) предоставляет хеш-функцию как параметр шаблона по умолчанию. В качестве разработчика контейнера вы не должны настаивать на решениях, которые могут быть сделаны во время компиляции для запуска. Особенно «типичный» материал, который, как известно, медленный. –

+0

Проклятье слишком поздно с ответом, чтобы поддержать мой комментарий. Вы также можете видеть код в любом случае [здесь] (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).


В качестве альтернативы, вы можете использовать if constexpr(...) в C++ 17:

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)' будет в порядке, поскольку аргумент шаблона будет выведен * (а функция без шаблона будет иметь приоритет над шаблоном) *. –