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
选择部分特化以进行实例化.