Преобразование параметров при передаче в функции (c ++) - PullRequest
0 голосов
/ 28 апреля 2018

Я только начинаю учить себя C ++ и испытываю трудности с передачей параметров функции. Например, я использую свою собственную функцию печати, в которой вы просто помещаете строку в параметры и она записывает ее на консоль.

//Print Function
void print(std::string message = "") {
    std::cout << message << std::endl;
}

Однако, поскольку я объявляю его как переменную std::string, если я передам ему число, оно не будет напечатано. В конечном итоге я хотел бы создать систему ввода и печати, как в Python. Как мне пойти по этому поводу? Есть ли способ преобразовать параметры в строку? Или какое-то другое решение. Другая функция с похожими проблемами - это моя функция ввода:

//Input function (Enter does not work without text, space is not text)
std::string input(const char* message = "") {
    std::cout << message;
    std::string x;
    std::cin >> x;
    return x;
}

Это не позволяет возврату быть целым, который делает вычисления, используя ввод сложнее. Любая помощь приветствуется заранее!

~ Моисей

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Помимо template, если ваш компилятор поддерживает C ++ 14, вы также можете использовать auto с лямбда-функцией. Вы можете просто написать все это в основной функции.

auto print = [](const auto& message) {std::cout << message << std::endl;};
print(1); //1
print("AAA"); //AAA

Обратите внимание, что в отличие от Python, когда вы хотите напечатать что-то, вам не нужно сначала конвертировать его в string. Пока то, что вы хотите напечатать, перегружено cout, вы можете просто cout его. И использование template или auto не меняет того факта, что все в C ++ статически типизировано, просто компилятор автоматически создаст для вас разные версии функций перегрузки.

EDIT Как отметил @Peter в разделе комментариев, выражение «cout - это то, что может быть перегружено, является неправильным», и точнее сказать, перегрузка operator<< для ostream и соответствующего класса

0 голосов
/ 29 апреля 2018

В качестве альтернативы я нашел способ сделать это без использования лямбды:

void print(int message) {
    std::cout << message << std::endl;
};

void print(float message) {
    std::cout << message << std::endl;
};

void print(std::string message) {
    std::cout << message << std::endl;
};

Делая несколько функций с одним и тем же именем, он будет использовать то, что когда-либо работает, поэтому любой ввод (3.14, 8, «Hello») будет работать и использовать соответствующую функцию.

0 голосов
/ 28 апреля 2018

Can ++ шаблоны полезны там.

//Print Function
template <typename T>
void print(const T& message) {
  std::cout << message << std::endl;
}

void print() {
  std::cout << std::endl;
}

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

//Input function (Enter does not work without text, space is not text)
template <typename T>
T input(const char* message = "") 
{
  std::cout << message;
  T x;
  std::cin >> x;
  return x;
}

Использование: int n = input<int>("Input number:");.

...