Приема всички типове като аргумент във функцията

Как мога в C++ да накарам функция да приема всеки обект, така че да мога да й дам числа, низ или други обекти. Не съм много добре в C++, надявам се, че въпросът не е напълно глупав...

Редактиране: Добре, пример: ако искате да опитате да обвиете потоците std::cout в нормални функции, тази функция трябва да може да приема всичко - от Integers над Floats до сложни обекти. Надявам се сега да е по-ясно!


person Codeversum    schedule 22.01.2015    source източник
comment
Можете ли да дадете пример за това, което се опитвате да направите?   -  person Borgleader    schedule 22.01.2015
comment
И отговорът вероятно включва шаблони...   -  person Deduplicator    schedule 22.01.2015


Отговори (5)


Можете дапретоварватефункцията си за различни типове, т.е.

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

Можете да използвате шаблони за тази цел:

template <typename T>
void foo(T const & value)
{
    // value is of some type T, which can be any type at all.
}

Това, което всъщност можете да направите със стойността може да е доста ограничено, без да знаете нейния тип -- зависи от целта на вашата функция. (Ако някой се опита да извика функцията с тип аргумент, който причинява тази специализация на функцията да бъде неправилно оформена, тогава вашата шаблонна функция няма да не успее да създаде екземпляр и това ще бъде грешка по време на компилация.)

person cdhowie    schedule 22.01.2015

Не съм сигурен какво се опитвате да постигнете, но можете да подадете празен указател като параметър.

void foo(void* bar);
person PDizzle745    schedule 22.01.2015
comment
Използването на void * рядко е отговорът в съвременния C++. - person crashmstr; 22.01.2015
comment
Съгласен съм. Вероятно трябваше да дам пример за шаблон, както казаха други. - person PDizzle745; 22.01.2015

Ако съм ви разбрал правилно, може да опитате да използвате шаблони http://en.cppreference.com/w/cpp/language/function_template

person Marko Stojanovic    schedule 22.01.2015

Вероятно търсите шаблони.
Предлагам ви да прочетете това.

person Axalo    schedule 22.01.2015