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
、temp2
、temp3
など。その後、クラスで:
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;
タイピングの手間が省けます。