Можете дапретоварватефункцията си за различни типове, т.е.
size_t func(int);
size_t func(std::string);
Като алтернатива и/или допълнително можете да предоставите шаблон на функция, който е начин да кажете на компилатора как да генерира вашата функция за всеки конкретен тип, например
template<typename T>
size_t func(T const&) { return sizeof(T); }
Можете да използвате по-усъвършенствани техники като SFINAE, за да претоварите ефективно тези функции на шаблона, т.е. да използвате различни шаблони за различен тип типове T
(т.е. интегрални типове, указател, вградени типове, под и т.н.). След това компилаторът ще избере най-подходящия func()
(ако има такъв) за всяко извикване на функция, което срещне и, ако това е шаблон, ще генерира подходяща функция. Това не изисква повторно кодиране.
Напълно различен подход е да се използва общ тип изтриване, като boost::any
, когато функцията ще трябва да разреши очакваните типове по време на кодиране (за разлика от времето на компилиране):
size_t func(boost::any const&x)
{
auto i = boost::any_cast<const int*>(x);
if(i) return func(*i);
// etc for other types, but this must be done at coding time!
}
person
Walter
schedule
22.01.2015