Принимать все типы в качестве аргумента в функции

Как я могу в С++ заставить функцию принимать каждый объект, чтобы я мог дать ему числа, строку или другие объекты. Я не очень хорошо разбираюсь в С++, надеюсь, это не совсем глупый вопрос...

Редактировать: хорошо, пример: если вы хотите попытаться обернуть потоки std::cout в обычные функции, эта функция должна иметь возможность принимать все - от целых чисел над числами с плавающей запятой до сложных объектов. Надеюсь теперь стало понятнее!


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 (т. е. целочисленных типов, указателей, встроенных типов, pod и т. д.). Затем компилятор выберет наиболее подходящий 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 в качестве параметра.

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