4

我在琢磨partial specialization。虽然我理解这个想法,但我还没有看到这种技术在现实世界中的任何用法。Full specialization在很多地方都使用过,STL所以我对此没有问题。你能告诉我一个真实世界的例子partial specialization吗?如果有例子STL那就更好了!

4

3 回答 3

13

C++0x 附带了which 是一个将被弃用unique_ptr的替代品。auto_ptr

如果您unique_ptr与数组类型一起使用,它delete[]会释放它,并提供operator[]等。如果您将它与非数组类型一起使用,它会使用delete. 这需要部分模板专业化,例如

template<typename T>
struct my_unique_ptr { ... };

template<typename T>
struct my_unique_ptr<T[]> { ... };

另一个用途(尽管非常值得怀疑)是std::vector<bool, Allocator>在标准库中。bool 特化使用空间优化将 bool 打包成单独的位

template<typename T, typename Allocator = std::allocator<T> >
struct vector { ... };

template<typename Allocator>
struct vector<bool, Allocator> { ... };

还有一个用途是 with std::iterator_traits<T>。迭代器需要定义嵌套的 typedefsvalue_typereference其他正确的类型(例如,对于 const 迭代器,reference通常是T const&),因此算法可以将它们用于他们的工作。主模板依次使用迭代器类型的类型成员

template<typename T>
struct iterator_traits { 
  typedef typename T::value_type value_type; 
  ...
};

对于指针,这当然行不通。他们有部分专业化

template<typename T>
struct iterator_traits<T*> {
  typedef T value_type;
  ...
};
于 2009-08-27T16:54:25.867 回答
5

在一些 stl 实现中std::vector,集合喜欢std::list使用部分模板特化来减少为指针集合生成的代码量。

类型 T 的模板的每个实例化都会创建新代码。然而,指针类型实际上都是相同的,因此为每种类型生成新代码是一种浪费。这可以通过使用 void 指针实现指针集合的私有部分,然后将它们转换为公共接口中的适当类型来减少。这大大减少了为指针集合生成的代码。

我认为这包含在有效 STL 中。

于 2009-08-27T23:48:38.870 回答
1

取自 MSDN(类模板的部分专业化 (C++))

// partial_specialization_of_class_templates.cpp
template <class T> struct PTS {
   enum {
      IsPointer = 0,
      IsPointerToDataMember = 0
   };
};

template <class T> struct PTS<T*> {
   enum {
      IsPointer = 1,
      IsPointerToDataMember = 0
   };
};

template <class T, class U> struct PTS<T U::*> {
   enum {
      IsPointer = 0,
      IsPointerToDataMember = 1
   };
};
于 2009-08-27T16:54:48.630 回答