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;
...
};