2016-03-30 3 views
1

Скажем, у меня есть следующий код:Есть ли способ проверить, какой тип данных является шаблоном?

template<typename K, typename V> 
    int Hash<K, V>::hf(const K& key) 
    { 
     if(K == typeid(string)) 
     { 
      return MurmurHash2(key.c_str(), key.size()); 
     } 
     else 
     { 
      return key*2654435761; 
     } 

} 

Можно ли сделать это в некотором роде? Если бы вы не рекомендовали метод для достижения того же самого?

+4

template специализация? – isedev

+1

@isedev, я бы предпочел перегрузку. – SergeyA

+0

@isedev Вы могли бы привести пример специализации шаблона, который раньше никогда не использовал. – Iriketurtles

ответ

0

Вы можете использовать (частично) специализации шаблона:

// general case 
template <typename K, typename V> 
    int Hash<K, V>::hf(const K& key) 
    { 
     return key*2654435761; 
    } 

// string case 
template <typename V> 
    int Hash<std::string, V>::hf(const std::string& key) 
    { 
     return MurmurHash2(key.c_str(), key.size()); 
    } 
+0

Im получение некоторых ошибок, говорящих, что невозможно сопоставить определение функции с существующим замедлением – Iriketurtles

0

Вот 2 способа сделать это:

1) Шаблон специализации (делая особый случай для аргумента шаблона (здесь: std::string))

template<typename K, typename V> 
int Hash(const K& key) 
{ 
    return key * 2654435761; 
} 

template<typename V> 
int Hash(const std::string& key) 
{ 
    return MurmurHash2(key.c_str(), key.size()); 
} 

2) Использование typeid для сравнения типов

template<typename K, typename V> 
int Hash(const K& key) 
{ 
    if (typeid(K).hash_code() == typeid(std::string).hash_code()) 
     return MurmurHash2(key.c_str(), key.size()); 
    return key * 2654435761; 
} 
+1

Это отличается от фактического вопроса, когда hf является членом класса. Также нет гарантии, что сравнение типа typeid() 'того же типа даст true. – SergeyA

+0

Спасибо! 'hash_code()' гарантированно будет одинаковым для тех же типов. – Rakete1111

Смежные вопросы