Синтаксис частичной специализации шаблона C ++ - PullRequest
3 голосов
/ 15 декабря 2010

для основного шаблона:

template<typename A, typename B> class MyClass {...

со специализацией шаблона, в чем разница между

template<typename A, typename B> class MyClass<int, float> {...

и

template<> class MyClass<int, float> {...

1 Ответ

6 голосов
/ 15 декабря 2010

template<typename A, typename B> class MyClass<int, float> {... не допускается. Действительно, если вы укажете формальные параметры A и B, ваш шаблон должен использовать их.

Второй случай просто нормален: вы говорите, что делаете специализацию без «свободных» параметров.

Промежуточный случай может быть

template<typename A> class MyClass<A, float> {...

, который снова действителен: здесь вы фиксируете только второй параметр шаблона.

Идея частичной специализации заключается в следующем: вы создаете шаблон с некоторыми формальными параметрами и используете их для выражения ограничений на параметры исходного шаблона. Параметры частичной специализации не обязательно должны совпадать с параметрами исходного шаблона. Пример:

template<typename X, typename Y, typename Z> class MyClass<X*, Y(Z&)> {...

будет действительной частичной специализацией для вашего случая. Это можно прочитать как «для произвольных типов X, Y и Z, если параметры шаблона MyClass соответствуют X* и Y(Z&), используйте эту специализацию». Компилятор должен быть достаточно умным, чтобы соответствовать шаблону типа.

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