Вопрос по шаблону C ++ - PullRequest
       2

Вопрос по шаблону C ++

3 голосов
/ 04 февраля 2011

Предположим, следующее определение шаблона (код не имеет смысла):

template<class X, class Y>
bool FooBar(const Y& val) { return sizeof(X) + 4; }

Я обнаружил, что следующий код вызова был допустимым:

float temp = 0.f;
FooBar<int>(temp);

Как видите, второйпараметр типа Y может быть опущен.Компилятор определяет тип Y, просматривая тип аргумента temp.

Какое правило или спецификация шаблона C ++ допускает это?Я был очень удивлен, увидев это.

Ответы [ 4 ]

5 голосов
/ 04 февраля 2011

Это вывод аргумента шаблона; он такой же, как если бы вы использовали X в качестве типа параметра значения FooBar и вызывали его без каких-либо аргументов шаблона вообще. Документ с более подробной информацией можно найти на сайте компилятора IBM .

3 голосов
/ 04 февраля 2011

14.7.1. Пункт 2:

Если специализация шаблона функции не была явно создана или явно специализирована, специализация шаблона функции создается неявно, когда на специализацию ссылаются в контексте, который требует определения функции.

Как указывает Иеремия, вывод аргументов - это то, о чем вы действительно спрашиваете:

14.8.2:

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

Процесс подробно описан там.

Источник: ИСО / МЭК 14882: 1998 (E)

1 голос
/ 04 февраля 2011

Вам не обязательно указывать каждый параметр типа.По сути, компилятор вычисляет Y по типу передаваемого параметра, а вы указали X в своем объявлении.Еще одно различие между Java и C ++.

1 голос
/ 04 февраля 2011

Это называется «неявное создание шаблона». См. Стандарт, раздел 14.7.1. Я хотел бы отметить, что это очень часто используется для шаблонов функций.

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