2015-01-22 7 views
4

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

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

+0

Можете ли вы привести пример того, что вы пытаетесь сделать? – Borgleader

+2

И ответ, вероятно, включает в себя шаблоны ... – Deduplicator

ответ

6

Вы можете перегрузки ваша функция для разных типов, т.е.

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! 
} 
0

Возможно, вы ищете шаблоны.
Предлагаю вам прочитать this.

1

Я не уверен, чего вы пытаетесь выполнить, но вы можете передать указатель на пустоту в качестве параметра.

void foo(void* bar); 
+2

Использование 'void *' редко является ответом в современном C++. – crashmstr

+0

Согласен. Вероятно, я должен был представить пример шаблона, как утверждают другие. – PDizzle745

2

Вы можете использовать шаблоны для этой цели:

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

Что вы можете сделать со значением может быть довольно ограниченный, не зная его типа - это зависит от цели вашей функции. (Если кто-то пытается вызвать функцию с типом аргумента, который вызывает эту функцию специализации будет плохо сформирован, то ваша функция шаблон не экземпляр и это будет ошибка времени компиляции.)

Смежные вопросы