【问题标题】:Why use template<> without specialization?为什么不用特化就使用模板<>?
【发布时间】:2010-02-20 04:39:37
【问题描述】:

我在看STL源代码(原来是既好玩又好用),偶然发现了这种东西

//file backwards/auto_ptr.h, but also found on many others.

template<typename _Tp>                                                                                                 
      class auto_ptr

//Question is about this:
template<>
    class auto_ptr<void>

是否添加了template&lt;&gt; 部分以避免类重复?

【问题讨论】:

  • 你的标题很混乱,你到底是什么意思?
  • 我在问模板有什么用。
  • 这只是用于说“这是一个模板类,但我不需要任何模板”的语法,因为您将自己填写它。

标签: c++ templates stl


【解决方案1】:

那是专业化。例如:

template <typename T>
struct is_void
{
    static const bool value = false;
};

对于 any 类型,此模板将 is_void&lt;T&gt;::value 作为 false,这显然是不正确的。你可以做的就是用这个语法说“我自己填写T,并且专门”:

template <> // I'm gonna make a type specifically
struct is_void<void> // and that type is void
{
    static const bool value = true; // and now I can change it however I want
};

现在is_void&lt;T&gt;::valuefalse,除非Tvoid。然后编译器选择更专业的版本,我们得到true

因此,就您而言,它具有auto_ptr 的通用实现。但是该实现与void 存在问题。具体来说,它不能被取消引用,因为它没有与之关联的类型。

所以我们可以做的是专门化auto_ptrvoid 变体来删除这些功能。

【讨论】:

  • 谢谢,解释得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2018-07-02
  • 1970-01-01
  • 2013-09-05
相关资源
最近更新 更多