Обычный способ вызова шаблонной функции - PullRequest
1 голос
/ 04 февраля 2012
struct A
{
    template <class U> 
    void f(U)
    {

    }
};

template <class T>
void f(T t) 
{
    A a;
    a.template f<int>(t);
    a.template f<>(t);
    a.f<int>(t);
    a.f<>(t);
    a.f(t);
}

По крайней мере в соответствии с MSVC2010 приведенный выше код прекрасно компилируется.

Из всех способов вызова A.f есть ли какой-нибудь преференциальный способ сделать это?

Есть ли различия?

Ответы [ 3 ]

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

Ну, a имеет тип A, который в данном контексте не является зависимым типом. Поэтому ключевое слово template не нужно и служит только для запутывания кода - не используйте его.

Версия, которая вызывает шаблон без предоставления каких-либо аргументов, опять же ничего не делает для изменения поведения и только делает код менее читабельным - тоже не используйте его.

Между двумя оставшимися кандидатами, a.f(t) и a.f<int>(t), используйте первое в большинстве случаев и второе, если компилятор не может определить тип.

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

Отличий нет вообще.Если у вас нет причин предоставлять информацию о типе функции, последняя является лучшей.Но вы можете захотеть, чтобы ваша функция обрабатывала аргументы, как если бы они были заданного типа, только тогда, если вам нужно <>.Например,

T Divide(T a, T b)
{
    return a/b;
}

Если вы позвоните в Divide (5,2), вы получите 2. Только такие случаи, если вы укажете тип:

Divide<float>(5,2);

Возвращает 2,5.

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

Последний кажется наиболее простым для написания.

В противном случае нет никаких отличий, если только вам не придется устранять неоднозначность между несколькими буквами.

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