声明中的类名后面再次<>什么?...template<B,C>class D<C,B>{}

What is <> again after class name in declaration? ... template<B,C>class D<C,B>{}

本文关键字:lt gt template class 什么 声明      更新时间:2023-10-16

我在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
{    /*.......*/ }

重复声明模板(#B1&#B2)的含义是什么
哪个C++规范允许<>两次
它叫什么。。。我想进一步了解它。
它是一种别名吗
一般来说,它怎么会有用?

我在cppresence中找不到这样的签名
这是一种前沿的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> 
{    /*.......*/ }

//A是主类模板Collection,而//B类别模板Collection部分专门化。基本上,你是专业化的:

template <typename Tf, Tf F>
class Collection;

类模板上:

template<typename K, typename ... I>
class HashFunction<K, I...>;

因此,如果HashFunction的任何实例化类型被用作Collection的模板Argument,则会选择部分专门化//B进行实例化。