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)
在某些stl实现集合中std::vector
,std::list
使用部分模板特化来减少为指针集合生成的代码量.
类型T的模板的每个实例化都创建新代码.但是指针类型实际上完全相同,因此为每种类型生成新代码都是浪费.这可以通过使用void指针实现指针集合的私有部分,然后将它们转换为公共接口中的适当类型来减少.这大大减少了为指针集合生成的代码.
我认为这包含在有效STL中.