我在SO中找到了关于模板的a strange code。这就像两次声明模板签名一样。
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
{ /*.......*/ }
重复声明模板(#B1
&amp; #B2
)的含义是什么?
哪个C ++规范允许<>
两次?
这叫什么? ......我想更多地了解它。
它是一种别名吗?
一般来说,它如何有用?
我在cppreference找不到这样的签名 它是一种前沿的C ++语法吗?
答案 0 :(得分: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>
{ /*.......*/ }
//A
是主类模板 Collection
,而//B
是类模板的partial-specialization Collection
。基本上,你是专业的:
template <typename Tf, Tf F>
class Collection;
class-template 上的:
template<typename K, typename ... I>
class HashFunction<K, I...>;
因此,如果HashFunction
的任何实例化类型用作Collection
的模板参数,则会选择部分特化//B
进行实例化。