模板部分专业化 - 任何现实世界的例子?

时间:2009-08-27 16:47:27

标签: c++ templates partial-specialization

我正在思考partial specialization。虽然我理解这个想法,但我还没有看到这种技术的任何实际用法。 Full specialization中的许多地方都使用STL,因此我没有遇到任何问题。你可以教我一个使用partial specialization的真实世界的例子吗?如果示例位于STL中,那就更好了!

3 个答案:

答案 0 :(得分:13)

C ++ 0x附带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> { ... };

另一个用途是使用std::iterator_traits<T>。迭代器需要将嵌套的typedef value_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;
  ...
};

答案 1 :(得分:5)

在某些stl实现中,像std::vectorstd::list这样的集合使用部分模板特化来减少为指针集合生成的代码量。

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

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

答案 2 :(得分: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
   };
};