【问题标题】:What is <> again after class name in declaration? ... template<B,C>class D<C,B>{}<> 在声明中的类名之后又是什么? ... 模板<B,C>类 D<C,B>{}
【发布时间】:2017-02-13 09:01:12
【问题描述】:

我发现a strange code 关于 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++ 规范允许 &lt;&gt; 两次?
这叫什么? ...我想深入了解它。
是不是一种别名?
一般来说,它有什么用处?

我在cppreference 中没有找到这样的签名。
它是最前沿的 C++ 语法吗?

【问题讨论】:

  • 它是 class-templatepartial-specialization
  • @StoryTeller 哇!谢谢。
  • 我试图找到一个副本,但运气不佳。如果您准备在回答自己的问题时记录您学到的知识,您可以自己发布答案,这将使整个网站受益。
  • @StoryTeller 如果您只是发布链接(实际上只是将您的评论复制到答案),我会接受。我认为人们可以很容易地从您的链接中挖掘更多关于它的信息。 XD

标签: c++ templates language-lawyer


【解决方案1】:
// 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类模板 Collectionpartial-specialization。基本上,你是专攻的:

template <typename Tf, Tf F>
class Collection;

类模板上:

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

因此,如果 HashFunction 的任何实例化类型用作 Collection 的模板参数,则选择部分特化 //B 进行实例化。


【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多