переменные — преобразование параметров при передаче в функции (c ++)

Я только начинаю изучать 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;
}

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

Моисей

1

Решение

Кроме того 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 ++ статически типизировано, просто компилятор автоматически создаст для вас разные версии функций перегрузки.

РЕДАКТИРОВАТЬ
Как отметил @Peter в разделе комментариев, говоря:cout что-то, что может быть перегружено, совершенно неверно «, и, точнее сказать, перегрузка operator<< для ostream и соответствующий класс

0

Другие решения

Здесь могут быть полезны шаблоны ++.

//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:");,

0

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

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
По вопросам рекламы [email protected]