2015-10-19 3 views
0

Я создаю эквивалент JavaScript.log на языке C++, но не знаю, как заставить мою функцию ожидать различные типы аргументов.Ожидание различных типов аргументов в C++

В JavaScript:

function print(arg) 
{ 
    if(typeof arg=="number") { ... } 
    if(typeof arg=="string") { ... }  
} 

Конечно, JavaScript не волнует, что вы даете функцию, но C++ делает, так как я могу иметь его поймать любой (или по крайней мере указать типы для того, чтобы принять), который будет обрабатываться позже в самой функции?

Все, что я до сих пор:

void print(string input) 
{ 
    cout << input << "\n"; 
} 
+0

Вы хотите, чтобы он мог принимать различные типы ввода, такие как int или double или string? –

ответ

4

Вы можете сделать это с помощью function template.

template <typename T> 
void print(const T& output) 
{ 
    std::cout << output << "\n"; 
} 

Это создаст print функцию для каждого типа вы передаете к нему.

Edit:

Из комментариев, если вы хотите, чтобы это работать с массивами, а затем вы можете добавить

template<typename T, std::size_t N> 
void print(T (&output)[N]) 
{ 
    for (std::size_t i = 0; i < N; i++) 
    { 
     std::cout << output[i] << " "; 
    } 
    std::cout << "\n"; 
} 

Вы Cann увидеть все это работает вместе в этом Live Example

+0

Это именно то, что я искал! Благодаря! Будет ли это работать с массивами? Я очень незнакома с массивами, поэтому я даже не уверен, как тестировать такие. –

+0

@jeremiahchandler Нет, это не сработает с массивами. Для печати массивов см .: http://stackoverflow.com/questions/1370323/printing-an-array-in-c – NathanOliver

+0

Я имею в виду, что я знаю, что вывод на печать не будет печатать массив, но будет ли этот шаблон по крайней мере ПРИНИМАТЬ массив для меня управлять внутри него? –

0

Решена проблема.

std::cerr << "My console output with a number! " << 42 << std::endl; 

Это идет в STDERR, выходной поток, как правило, обрабатываются вашей оболочкой иначе, чем стандартный вывод, с тем, чтобы помочь в отладке и придирчивости. Это идеальный аналог JavaScript console.log, и он уже существует.

0

Вы можете использовать функциональные шаблоны, как описано NathanOliver.

Вы также можете использовать функцию перегрузки: просто определите несколько функций с тем же именем, но с разными типами аргументов. Компилятор выберет правильный. Перегрузка функций может быть лучше, чем функция шаблона в зависимости от того, что вы делаете. В частности, если для каждого типа параметра требуется обращение к другому телу функции, функция перегрузки, вероятно, имеет больше смысла, чем шаблон.

+2

Это решение _is_ Nathan ... все ваши варианты требуют, чтобы OP записывал каждую перегрузку вручную. –

+0

Я попытался добавить больше аргументов в свой ответ. Шаблоны - это способ генерации нескольких функций, которые все используют одно и то же тело.Перегрузка функций - это способ записи функций с разными телами, которые можно вызвать аналогично. В зависимости от того, что вы делаете, вы можете захотеть иметь разные тела, поэтому функция перегрузки имеет больше смысла. Я не уверен, работает ли шаблонная специализация для шаблонов функций; поэтому, если вы хотите иметь разные тела функций без перегрузки, это может быть сложно. –

+0

Шаблоны функций при создании экземпляра производят перегрузки функций. Эти перегрузки абсолютно не «разделяют одно и то же тело» - они отличаются везде, где вы использовали зависимое имя. В каком-то смысле вы пытаетесь сравнить яблоки и яблоки. Единственное различие заключается в том, что Натан получает свои яблоки от зеленщика, тогда как вы выращиваете каждый сорт самостоятельно в своем саду. –

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