2016-03-30 5 views
1

sagen, dass ich den folgenden Code haben:Gibt es eine Möglichkeit zu überprüfen, welcher Datentyp eine Vorlage ist?

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; 
     } 

} 

Ist es möglich, diese in irgendeiner Weise zu tun? Wenn nicht, könntest du eine Methode empfehlen, um dasselbe zu erreichen?

+4

Vorlage Spezialisierung? – isedev

+1

@isedev, würde ich lieber überladen. – SergeyA

+0

@isedev könnten Sie ein Beispiel für Template-Spezialisierung geben, das ich noch nie benutzt habe. – Iriketurtles

Antwort

0

könnten Sie (Teil-) Template-Spezialisierung verwenden:

// 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

Ich bekomme einige Fehler, die sagen, dass Funktionsdefinition zu einer vorhandenen Verzögerung nicht übereinstimmen kann – Iriketurtles

0

Hier sind zwei Möglichkeiten, es zu tun:

1) Vorlage Spezialisierung (einen Sonderfall für ein Template-Argument zu machen (hier: 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) Verwenden von typeid die Typen zu vergleichen

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

Das unterscheidet sich von tatsächlicher Frage, wenn Hf Mitglied der Klasse ist. Es gibt auch keine Garantie, dass der Vergleich von 'typeid()' des gleichen Typs wahr ergibt. – SergeyA

+0

Danke! 'hash_code()' ist garantiert identisch für die gleichen Typen. – Rakete1111

Verwandte Themen