在 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;
将为您节省大量打字。