Streszczenie: nie rób tego.
Odpowiedź j_random_hackera mówi, jak to zrobić. Chciałbym jednak również zwrócić uwagę, że nie należy tego robić. Cały sens szablonów polega na tym, że mogą akceptować dowolny zgodny typ, a ograniczenia typu stylu Java to przerywają.
Ograniczenia typu Java to błąd, a nie funkcja. Są tam, ponieważ Java wymazuje typy typów ogólnych, więc Java nie może dowiedzieć się, jak wywołać metody na podstawie samych wartości parametrów typu.
Z drugiej strony C ++ nie ma takiego ograniczenia. Typy parametrów szablonów mogą być dowolnym typem zgodnym z operacjami, z którymi są używane. Nie musi istnieć wspólna klasa bazowa. Jest to podobne do "Duck Typing" w Pythonie, ale wykonywane w czasie kompilacji.
Prosty przykład pokazujący moc szablonów:
// Sum a vector of some type.
// Example:
// int total = sum({1,2,3,4,5});
template <typename T>
T sum(const vector<T>& vec) {
T total = T();
for (const T& x : vec) {
total += x;
}
return total;
}
Ta funkcja sumująca może sumować wektor dowolnego typu, który obsługuje prawidłowe operacje. Działa zarówno z prymitywami, takimi jak int / long / float / double, jak i typami liczbowymi zdefiniowanymi przez użytkownika, które przeciążają operator + =. Do licha, możesz nawet użyć tej funkcji do łączenia łańcuchów, ponieważ obsługują one + =.
Nie jest konieczne pakowanie / rozpakowywanie prymitywów.
Zauważ, że konstruuje również nowe wystąpienia T przy użyciu T (). Jest to trywialne w C ++ przy użyciu niejawnych interfejsów, ale w rzeczywistości nie jest możliwe w Javie z ograniczeniami typu.
Chociaż szablony C ++ nie mają jawnych ograniczeń typu, nadal są bezpieczne dla typów i nie będą kompilować się z kodem, który nie obsługuje poprawnych operacji.