如何使用许多模板参数简化表示法并在C ++中的另一个模板类中使用它

时间:2013-09-19 19:17:06

标签: c++ templates

我想使用声明为

的Google哈希地图
template <class Key, class T, class HashFcn, class EqualKey, class Alloc>
class dense_hash_map { ... };

并将此模板类作为其他模板类(如

)中的参数之一
template<template<class Key, class T, class HashFcn, class EqualKey, class Alloc > class GoogleHashTable, class SomeOtherClass>
class MyClass     {    }; 

我想简化普通话符号是这样的

template<GoogleTemplate class GoogleHashTable, class SomeOtherClass>

但如何将GoogleTemplate定义为

template<class Key, class T, class HashFcn, class EqualKey, class Alloc > 

2 个答案:

答案 0 :(得分:2)

在C ++ 11中,

 template <template <typename...> class GoogleHashTable, class SomeOtherClass>

,否则

 template <
      template <typename, typename, typename, typename> class GoogleHashTable,
      class SomeOtherClass
 >

现在,您需要额外的简化,例如在C ++ 11中

 template <template <typename...> class F>
 struct temp
 {
      template <typename... A>
      using map = F <A...>;
 };

 template <class G, class SomeOtherClass>
 class MyClass
 {
      template <typename... A>
      using GoogleHashTable = G::template map <A...>;
 };

这进一步简化了MyClass的声明,但如果您想像往常一样使用模板GoogleHashTable而不需要::template map内容,则需要在其定义中使用额外的模板别名。

此外,要使用MyClass,您现在必须编写

MyClass <temp <GoogleHashTable>, SomeOtherClass>

而不是

MyClass <GoogleHashTable, SomeOtherClass>

当然,除非你

typedef temp <GoogleHashTable> /*some name*/;

修改

在C ++ 03或更早版本:

 template <template <typename, typename, typename, typename> class F>
 struct temp4
 {
      template <typename A1, typename A2, typename A3, typename A4>
      struct map { typedef F <A1, A2, A3, A4> type; };
 };

类似地,temp1temp2temp3等等。然后在你的班级中:

 template <class G, class SomeOtherClass>
 class MyClass
 {
      // now GoogleHashTable <A1, A2, A3, A4>
      // is expressed as typename G::template map <A1, A2, A3, A4>::type
 };

这样方便得多,但如果A1, A2, A3, A4内的MyClass个参数已修复,那么

 typedef typename G::template map <A1, A2, A3, A4>::type Table;

将为您节省大量的打字费用。

答案 1 :(得分:0)

在C ++ 11中,您可以使用using指令做很多事情。请参阅this讨论。