Зачем использовать шаблон <> без специализации? - PullRequest
3 голосов
/ 20 февраля 2010

Я читал исходный код STL (который оказался и забавным, и очень полезным), и я натолкнулся на подобные вещи

//file backwards/auto_ptr.h, but also found on many others.

template<typename _Tp>                                                                                                 
      class auto_ptr

//Question is about this:
template<>
    class auto_ptr<void>

Добавлена ​​ли часть template<>, чтобы избежать дублирования классов?

1 Ответ

7 голосов
/ 20 февраля 2010

Это специализация.Например:

template <typename T>
struct is_void
{
    static const bool value = false;
};

Этот шаблон будет иметь is_void<T>::value как false для любого типа, что, очевидно, неверно.Что вы можете сделать, это использовать этот синтаксис, чтобы сказать: «Я сам заполняю T и специализируюсь»:

template <> // I'm gonna make a type specifically
struct is_void<void> // and that type is void
{
    static const bool value = true; // and now I can change it however I want
};

Теперь is_void<T>::value равно false за исключением случаев, когда T равно voidЗатем компилятор выбирает более специализированную версию, и мы получаем true.

Таким образом, в вашем случае он имеет общую реализацию auto_ptr.Но эта реализация имеет проблему с void.В частности, его нельзя разыменовать, поскольку с ним не связано ни одного типа.

Поэтому мы можем специализировать void вариант auto_ptr для удаления этих функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...