在声明中的类名之后又是什么?...模板<B,C> D类<C,B> {}

jav*_*ver 2 c++ templates language-lawyer

我在SO中发现了一个关于模板的奇怪代码.这就像两次声明模板签名一样.

template <typename Tf, Tf F>
class Collection;

template <typename K, typename ... I, HashFunction<K, I...> F>   //<-- #B1
class Collection<HashFunction<K, I...>, F>    //<-- <> again!          #B2
 {    /*.......*/ }
Run Code Online (Sandbox Code Playgroud)

重复声明模板(#B1&#B2)的含义是什么?
哪个C++规范允许<>两次?
这叫什么?......我想更多地了解它.
它是一种别名吗?
一般来说,它如何有用呢?

我没有在cppreference中找到这样的签名.
它是一种前沿的C++语法吗?

Whi*_*TiM 5

// A
template <typename Tf, Tf F>
class Collection;


// B
template <typename K, typename ... I, HashFunction<K, I...> F>
class Collection<HashFunction<K, I...>, F> 
 {    /*.......*/ }
Run Code Online (Sandbox Code Playgroud)

//A是主类模板 Collection,而//B是一个局部专业化的的类模板 Collection.基本上,你是专业的:

template <typename Tf, Tf F>
class Collection;
Run Code Online (Sandbox Code Playgroud)

类模板上:

template<typename K, typename ... I>
class HashFunction<K, I...>;
Run Code Online (Sandbox Code Playgroud)

因此,如果任何实例化类型HashFunction用作模板Argument to Collection,则//B选择部分特化以进行实例化.