Являются ли параметры конструктора ненужными в & lt; stl_hashtable & gt;

В реализации SGI STL <stl_hashtable.h> hashtable класс имеет ctor как:

template <class Value, class Key, class HashFcn,
class ExtractKey, class EqualKey,
class Alloc>
class hashtable {
public:
typedef Key key_type;
typedef Value value_type;
typedef HashFcn hasher;
typedef EqualKey key_equal;
//other type definitions

hasher hash_funct() const { return hash; }
key_equal key_eq() const { return equals; }

private:
hasher hash;//hash function which might be a functor
key_equal equals;//compare functor that returns two key is equal or not
ExtractKey get_key;//functor used when we extract a key from value, see bkt_numpublic:
//There is no default ctor
hashtable(size_type n, //------------(1)
const HashFcn&    hf,
const EqualKey&   eql,
const ExtractKey& ext)
: hash(hf), equals(eql), get_key(ext), num_elements(0)
{
initialize_buckets(n);
}
hashtable(size_type n, //------------(2)
const HashFcn&    hf,
const EqualKey&   eql)
: hash(hf), equals(eql), get_key(ExtractKey()), num_elements(0)
{
initialize_buckets(n);
}
//...
}

Я бродил, так как мы уже объявили ExtractKey, HashFcn и EqualKey в качестве параметра шаблона, почему им нужен ctor, определенный в (1)? Не является ли параметр все ненужным, кроме size_type n? Мы можем использовать HashFcn() ExtractKey() и так далее. Как и в (2), но не во всех трех.

Так есть ли другие дальнейшие соображения по поводу этого?

0

Решение

Только тип указан параметром шаблона. Конструктор (1) необходим для предоставления экземпляров типов, указанных для использования в хеш-таблице. Сами экземпляры могут быть классами, которые имеют свои собственные элементы данных и были созданы с нетривиальной конструкцией.

Реализатор класса решил не предоставлять конструктор по умолчанию. Это позволяет пользователю реализовать операции сравнения хешей и равенств, которые не могут быть построены по умолчанию, то есть классы могут иметь нетривиальное состояние, для которого нет подходящего значения по умолчанию, которое использовалось бы конструктором по умолчанию.

Вы заметили, что constructor (2) использует конструкцию ExtractKey по умолчанию, но все же позволяет компаратору хеша и равенства быть нестраиваемым по умолчанию.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]