什么是&lt;&gt;在声明中的类名后再次? ...模板<b,c> D类<c,b> {}

时间:2017-02-13 09:01:13

标签: c++ templates language-lawyer

我在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 ++语法吗?

1 个答案:

答案 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进行实例化。