Oki, z tego co wyczytałem, to konkretyzacje dzielą się na:
- niejawna - kompilator na podstawie szablonu tworzy funkcję dla naszego typu, ale dopiero gdy w kodzie znajdzie się wywołanie funkcji z danymi typami, przyklad
template < nametype T >
void Swap( T & a, T & b ) {...}
int main() {
int a = 5, b = 6;
double c = 1.4, d = 8.12;
float e = 5.6, f = 0.01;
Swap( a, b );
Swap( c, d );
Swap( c, e );
}
- jawna - sami tworzymy funkcję (różnica od niejawnej jest taka, że tu możemy mieć inne ciało funkcji i jest ona OD RAZU tworzona [nie jak w w/w przypadku] ) przyklad potem.
Specjalizacja:
- jawna - szablon funkcji (np. Swap) ma być inny dla danego typu. Od jawnej konkretyzacji różni się tym, że tam funkcja była od razu definiowana, a tu jakby jest inny szablon, więc jeśli wywołania funkcji z danymi argumentami nie będzie, to taka definicja funkcji nie zostanie stworzona. przyklad:
template < nametype T >
void Swap( T & a, T & b ) {...}
template <> void Swap < int >( double & a, double & b ) {...}
template void Swap < int >( float & a, float & b ) {...}
int main() {
int a = 5, b = 6;
double c = 6.7, d = 0.1;
Swap( a, b );
Swap( c, d );
}
- niejawna specjalizacja - nie mam pojęcia, co to. Domyślam się, że po prostu szablon funkcji.
Proszę mnie poprawić jeśli się mylę :)
I jeszcze 2 pytania:
1.
template < nametype A, nametype B > void Swap( A & a, B & b ) {...}
?
Co zrobić w przypadku konkretyzacji lub specjalizacji, tzn. przy specjalizacji mamy taką
konstrukcję:
template <> typ_funk nazwa_funk < typ >( arg, arg );
? Co mam wstawić w <typ> ? Przy w/w przykładach było łatwo, bo oba argumenty były int, więc sprawa była prosta. Ale co teraz? Użyć
decltype
? To samo, kiedy typem funkcji ma być zmienna A + zmienna B
template < nametype A, nametype B > decltype Swap( A & a, B & b ) {...}
?
2. Czy czymś jeszcze różni się specjalizacja od konkretyzacji (pomijam drobnostki jak <> po template).
Sorry, że się tak rozpisałem. :)
PS. @mokrowski
No i parametrem szablonu może być |
A klasa może być (oczywiście przeładuje potrzebne operatory)?