1

我想使用声明是的谷歌哈希图

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     {    }; 

我想将 previos 符号简化为这样的东西

template<GoogleTemplate class GoogleHashTable, class SomeOtherClass>

但如何定义GoogleTemplate

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

2 回答 2

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; };
 };

同样,temp1,temp2temp3。然后在您的班级中:

 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;

将为您节省大量打字。

于 2013-09-19T19:29:43.050 回答
0

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

于 2013-09-19T20:17:23.247 回答