代码之家  ›  专栏  ›  技术社区  ›  Tom

为什么使用模板<>而不专门化?

  •  3
  • Tom  · 技术社区  · 15 年前

    我在读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<> 为了避免类重复而添加的部分?

    1 回复  |  直到 9 年前
        1
  •  7
  •   GManNickG    15 年前

    这就是专业化。例如:

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

    此模板将 is_void<T>::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
    };
    

    现在 是“空的”<t>::值 除何时 T void . 然后编译器选择更专业的版本,我们得到 true .

    因此,在您的案例中,它具有 auto_ptr . 但是这个实现有一个问题 无效 . 具体来说,不能取消对它的引用,因为它没有关联的类型。

    所以我们能做的就是 无效 变异体 自动PTR 删除这些功能。