Как специализировать ТОЛЬКО один метод внутри класса шаблона с множеством типов аргументов - PullRequest
1 голос
/ 26 ноября 2011

Я реализую шаблонный класс HashTable в C ++, и его прототип выглядит так:

template<class K, class T, unsigned int containerSize=CONTAINER_SIZE>
class LPHashTableChained{
    ........

    unsigned int hashFunction(K& key);

}

Мой вопрос заключается в том, как я могу специализировать свой метод hashFunction(), чтобы он вел себя по-другому, когда K равенстроковый тип.

Я попытался реализовать функцию в правильном формате и со второй реализацией, в которой я опускаю аргумент class K и помещаю строку как тип, как показано ниже:

1-я реализация:

template<class K, class T, unsigned int containerSize>
unsigned int LPHashTableChained<K,T,containerSize>::hashFunction(K& key){

}

2-я реализация:

template<class T, unsigned int containerSize>
unsigned int LPHashTableChained<string,T,containerSize>::hashFunction(const string& key){

}

Но я получаю ошибки компиляции !!!

Какой самый простой способ указать это hashFunction при K= string???

Спасибо

1 Ответ

5 голосов
/ 26 ноября 2011

Вы не можете частично специализировать функции-члены шаблонов. (Тем не менее, все специализации в порядке.

Лучший подход для вашего класса - поступить так же, как это делает стандартная библиотека, и предоставить хеш-функцию в качестве аргумента шаблона «policy»:

template <typename K, typename V, typename Hash = std::hash<K>>
class HashTable
{
  Hash hasher;
  // use hasher(x)
};

Теперь вы можете просто специализировать хеш-код для вашего типа строки или предоставить свой собственный:

// provide custom

struct MyInsaneHasher { std::size_t operator()(const Foo &) const; };
HashTable<Foo, int, MyInsaneHasher> m1;

// add specialization for `std::hash`:

namespace std
{
  template <> struct hash<Bar> { size_t operator()(const Bar&) const; };
}
HashTable<Bar, int> m2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...