1

宣言しているGoogleハッシュマップを使いたい

template <class Key, class T, class HashFcn, class EqualKey, class Alloc>
class dense_hash_map { ... };

このテンプレートクラスを、次のような別のテンプレートクラスの引数の1つとして配置します

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

同様に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;

タイピングの手間が省けます。

于 2013-09-19T19:29:43.050 に答える
0

usingC++11 では、ディレクティブを使用して多くのことができます。このディスカッションを参照してください。

于 2013-09-19T20:17:23.247 に答える