C ++ hash_map具有以下模板参数:
template<typename Key, typename T, typename HashCompare, typename Allocator>
如何在不指定HashCompare的情况下指定分配器?
这不会编译:(
hash_map<EntityId, Entity*, , tbb::scalable_allocator>
答案 0 :(得分:11)
简单的答案是,你做不到。您不能跳过模板参数并让它选择模板的默认值。您唯一的选择是找出默认值并将其插入到您的声明中。
答案 1 :(得分:4)
你可以使用一个技巧,至少可以节省你必须弄清楚默认值是什么,但它确实要求你知道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;
答案 2 :(得分:3)
如果has map类型对typedef
模板参数有一些公共HashCompare
,则可以编写一个使用vanilla哈希映射类型获取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
可访问的内容。