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

How to simplify notation with many template arguments and use it in another template class in C++

本文关键字:另一个 C++ 参数 许多模 何使用 表示 并在      更新时间:2023-10-16

我想使用谷歌哈希映射哪个声明是

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 > 

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

这不太方便,但是如果您在MyClass中的某个点固定了A1, A2, A3, A4参数,则

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

将为您节省大量打字时间。

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

相关文章: