我在思考偏特化
。虽然我理解这个想法,但我还没有看到任何实际使用这种技术的例子。完全特化
在STL
中被广泛使用,所以我对此没有问题。你能教育我一个使用偏特化
的实际例子吗?如果这个例子在STL
中那就更好了!
我在思考偏特化
。虽然我理解这个想法,但我还没有看到任何实际使用这种技术的例子。完全特化
在STL
中被广泛使用,所以我对此没有问题。你能教育我一个使用偏特化
的实际例子吗?如果这个例子在STL
中那就更好了!
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>
一起使用。迭代器需要定义嵌套的typedefs 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;
...
};
vector<bool>
不再符合容器要求。 - Johannes Schaub - litbstd::vector
和std::list
这样的集合使用部分模板特化来减少为指针集合生成的代码量。引用自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
};
};