Пропуск параметра шаблона C++

C++ hash_map имеет следующие параметры шаблона:

template<typename Key, typename T, typename HashCompare, typename Allocator>

Как я могу указать Allocator без указания HashCompare?

Это не скомпилируется:(

hash_map<EntityId, Entity*, , tbb::scalable_allocator>

3 ответа

Решение

Есть один трюк, который вы можете использовать, который, по крайней мере, избавит вас от необходимости определять значение по умолчанию, но он требует, чтобы вы знали имя типа, как оно определено в hash_map,

Вероятно, hash_map будет объявлен примерно так:

class allocator {};
class hash_compare {};

template<typename Key
  , typename T
  , typename HashCompare = hash_compare
  , typename Allocator = allocator>
class hash_map
{
public:
  typedef HashCompare key_compare;
  // ...
};

Мы не можем оставить значение по умолчанию для хеша, но мы можем обратиться к значению по умолчанию, используя член typedef:

hash_map<EntityId
  , Entity*
  , hash_map<EntityId,Entity*>::key_compare  // find out the default hasher
  , tbb::scalable_allocator> hm;

Если вы собираетесь много использовать тип, то создайте typedef:

typedef hash_map<EntityId,Entity*>::key_compare EntityKeyCompare;

hash_map<EntityId
  , Entity*
  , EntityKeyCompare
  , tbb::scalable_allocator> hm;

Простой ответ заключается в том, что вы не можете. Вы не можете пропустить параметр шаблона и заставить его выбрать значение по умолчанию для шаблона. Единственный вариант - узнать, что является значением по умолчанию, и вставить его в декларацию.

Если у типа карты есть публичный typedef для HashCompare Параметр шаблона, вы можете написать мета-функцию, которая использует ванильный тип хэш-карты для получения компаратора std. Что-то вроде этого:

template< typename Key, typename T, typename Allocator>
struct hash_map_type {
  typedef typename hash_map<Key,T>::key_compare key_compare;
  typedef mash_map<Key,T,key_compare,Allocator> result_t;
};

typedef hash_map_type<int,string,my_allocator>::result_type my_hash_map;

Это, однако, зависит от чего-то подобного hash_map<Key,T>::key_compare быть доступным.

Другие вопросы по тегам