跳过C ++模板参数

时间:2009-08-14 04:21:07

标签: c++ templates

C ++ hash_map具有以下模板参数:

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

如何在不指定HashCompare的情况下指定分配器?

这不会编译:(

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

3 个答案:

答案 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可访问的内容。