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++语法吗?
// 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选择部分特化以进行实例化.