我在琢磨partial specialization
。虽然我理解这个想法,但我还没有看到这种技术在现实世界中的任何用法。Full specialization
在很多地方都使用过,STL
所以我对此没有问题。你能告诉我一个真实世界的例子partial specialization
吗?如果有例子STL
那就更好了!
3 回答
C++0x 附带了which 是一个将被弃用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> { ... };
还有一个用途是 with std::iterator_traits<T>
。迭代器需要定义嵌套的 typedefsvalue_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;
...
};
在一些 stl 实现中std::vector
,集合喜欢std::list
使用部分模板特化来减少为指针集合生成的代码量。
类型 T 的模板的每个实例化都会创建新代码。然而,指针类型实际上都是相同的,因此为每种类型生成新代码是一种浪费。这可以通过使用 void 指针实现指针集合的私有部分,然后将它们转换为公共接口中的适当类型来减少。这大大减少了为指针集合生成的代码。
我认为这包含在有效 STL 中。
取自 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
};
};