我正在思考partial specialization
。虽然我理解这个想法,但我还没有看到这种技术的任何实际用法。 Full specialization
中的许多地方都使用STL
,因此我没有遇到任何问题。你可以教我一个使用partial specialization
的真实世界的例子吗?如果示例位于STL
中,那就更好了!
答案 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_type
,reference
和其他类型定义为正确的类型(例如,对于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::vector
和std::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
};
};