Brzmi jak zwykłe użycie referencji. Czyli
template <typename T>
void swap(T& a, T& b) {
A w środku najprościej będzie zrobić kopię do zmiennej tymczasowej, jak u tkz.
czy da się to zrobić bez:
template <typename T> ?
Nie za bardzo. Szablony są w C++ie narzędziem dokładnie do tego - pisania uniwersalnych funkcji. Ta funkcja jest bardzo uniwersalna, zadziała na w zasadzie wszystkim poza niekopiowalnymi typami.
Swoją drogą, taką samą sygnaturę ma std::swap z biblioteki standardowej.