mam taki początek szablonu funkcji:
template<typedef t>
czy można jakoś określić, jakie typy może podać użytkownik? np tylko int i double?
mam taki początek szablonu funkcji:
template<typedef t>
czy można jakoś określić, jakie typy może podać użytkownik? np tylko int i double?
Można, służy do tego bardzo prosty mechanizm specjalizacji szablonów. Ale zazwyczaj jeśli musisz tak bardzo mocno ograniczać typy to szablony są zbędne i lepiej użyć zwykłego przeciążania funkcji.
Gdyby chodziło o całą rodzinę typów to:
Wersja foo1 tylko dla liczb zmienno-przecinkowych, pobierająca i zwracająca typ T:
template<class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
foo1(T t)
{
std::cout << "foo1: float\n";
return t;
}
To zależy ile i jakie te typy masz. Jeśli jest to kilka, to specjalizacjami. Jeśli pochodzą od jakiegoś typu generycznego (POD'a), to można narzędziami z <type_traits>. Jak masz robić "prawie wszystko tylko kilka nie", to wtedy rzucanie statycznych asercji na określonych typach lub usuwanie specjalizacji (C++11).
Poza tym o czym napisali poprzednicy można jeszcze wystawić publiczne api z konkretnymi typami (int, double) poprzez przeładowanie metody, a templatową implementację schować w private. Moim zdaniem to najprostsze rozwiązanie.