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

Ara*_*raK 4 c++ templates partial-specialization

我在思考partial specialization.虽然我理解这个想法,但我还没有看到这种技术的任何实际用法.Full specialization在很多地方使用,STL所以我没有问题.你能教育我一个真实世界的例子partial specialization吗?如果这个例子是STL优秀的!

Joh*_*itb 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[]> { ... };
Run Code Online (Sandbox Code Playgroud)

std::vector<bool, Allocator>标准库中还有另一种用途(尽管非常有问题).bool特化使用空间优化将bool打包成单个位

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

template<typename Allocator>
struct vector<bool, Allocator> { ... };
Run Code Online (Sandbox Code Playgroud)

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

template<typename T>
struct iterator_traits { 
  typedef typename T::value_type value_type; 
  ...
};
Run Code Online (Sandbox Code Playgroud)

对于指针,这当然不起作用.对他们有部分专业化

template<typename T>
struct iterator_traits<T*> {
  typedef T value_type;
  ...
};
Run Code Online (Sandbox Code Playgroud)


iai*_*ain 5

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

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

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