我想使用声明为
的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 >
答案 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; };
};
类似地,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;
将为您节省大量的打字费用。
答案 1 :(得分:0)
在C ++ 11中,您可以使用using
指令做很多事情。请参阅this讨论。