2009-07-17 13 views
6

Czy wywołując funkcję szablonu, można pominąć typ po nazwie funkcji?Pominięcie argumentów w szablonach C++

Jako przykład rozważmy funkcję

szablon <typename T> void f (T var) {...};

Czy można po prostu nazwać tak:

int x = 5;
f (x);

lub czy ma na typ?

int x = 5;
f <int> (x);

+3

nie można po prostu spróbować i zobaczyć, co się dzieje? Wydaje się łatwe do przetestowania. –

+6

@ Ed Swangren, Metoda "po prostu spróbuj" jest bardzo niedoinformowana. W najlepszym przypadku mówi ci, że dany kompilator dopuszcza daną składnię. Nie mówi nic o semantyce lub poprawności oświadczenia w odniesieniu do standardu językowego. – Trent

+0

Przypuszczam, że mogłem wyjaśnić pytanie. Jak zauważył uprzejmie Trent, nie chodziło o to, czy to się skompiluje. Ciekawi mnie, co dzieje się za kulisami i trudno jest znaleźć dobre informacje tam na zewnątrz! – Chris

Odpowiedz

17

Ilekroć kompilator może wywnioskować argumenty szablonu z argumentów funkcji, można je pominąć. Jest to również dobra praktyka, ponieważ ułatwi czytanie Twojego kodu.

Ponadto, można zostawić tylko argumenty szablon do końca, a nie początku lub w środku:

template<typename T, typename U> void f(T t) {} 
template<typename T, typename U> void g(U u) {} 

int main() { 
    f<int>(5);  // NOT LEGAL 
    f<int, int>(5); // LEGAL 

    g<int>(5);  // LEGAL 
    g<int, int>(5); // LEGAL 

    return 0; 
} 
10

Nie ma nic złego w wywoływaniu go z niejawnymi parametrami szablonu. Kompilator powiadomi Cię, jeśli się pomyli, w takim przypadku może być konieczne jawne zdefiniowanie parametrów szablonu w celu wywołania funkcji.

+1

Ta odpowiedź nie ma nawet sensu. Wywołujecie funkcje jawnie ... – Zifre

+1

Zifre, myślę, że miał na myśli "w takim przypadku konieczne może być jawne zawarcie parametrów szablonu w wywołaniu funkcji". – aem

+1

Nie mówię o wywołaniu funkcji jawnie lub niejawnie Mówię o jawnym definiowaniu parametrów szablonu ... – DeusAduro

Powiązane problemy