Как объявить переменную, прежде чем вы узнаете, какой именно тип данных?

Я новичок в С++, исходя из фона python.

Если мне нужен ввод от пользователя, а затем я хочу проверить, какой тип данных имеет вход (например, integer или float), как мне можно объявить переменную, которую я хочу назначить пользователю, чтобы ввести?

Ответ 1

Короткий ответ: вы не можете.

Длинный ответ: вы не можете. С++ - это статически типизированный язык, что означает, что вы должны определить тип во время компиляции. Python динамически типизируется, поэтому тип объекта может меняться от линии к строке.

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

Например, если вы хотите получить целочисленный ввод от пользователя:

int n;
std::cin >> n;

Поплавковый ввод:

float x;
std::cin >> x;

И так далее. Обратите внимание на эти два случая, если пользователь вводит что-то, отличное от целого числа или float, вам нужно будет проверить флаги std:: cin, чтобы увидеть, была ли ошибка.

Но вам нужно сообщить пользователю "Введите целое число сейчас" или "Ввести плавать сейчас". Вы не можете просто принять произвольный тип. Вместо этого создайте свой код, чтобы у вас были альтернативные пути кода для ввода целых чисел или с плавающей запятой. Или принудительно выполните одно или другое, и напечатайте сообщение об ошибке, когда они вводят неправильный тип ввода.

Не записывайте свой код, как на Python. Идиоматический код Python не является идиоматическим кодом на С++, и способ, которым вы выполняете, не будет выглядеть одинаково.

В С++ способ получения произвольного ввода будет выглядеть так:

std::string input;
std::cin >> input;

if (IsInteger(input)) 
{
   // do stuff with integer
}

else if (IsFloat(input))
{
   // do stuff with float
}

else
{
     std::cout << "Bad Input!" << std::endl;
}

Изменить: в качестве MSalters указано в комментарии. Фактически вы можете использовать boost::lexical_cast<T>(expr), чтобы передать строковое представление некоторому типу T (где T обычно является чем-то вроде int, float, double и т.д.). Обратите внимание, что вам, вероятно, еще придется сделать некоторые проверки, чтобы увидеть, является ли expr целым, плавающим или иным образом.

Ответ 2

Когда вы получите ввод от пользователя, он поступит как string. Например:

std::string inp;
std::cin >> inp;

Затем вы берете содержимое inp (которое является тем, что пользователь набрал), и заглядывайте в него, чтобы увидеть, какие символы он содержит. В этот момент вы можете принимать решения на основе того, содержит ли он (a) все цифры, (b) цифры и десятичную точку, или (c) что-то еще полностью.

Ответ 4

С++ - это статически типизированный язык. Все типы переменных должны быть известны во время компиляции.

Ответ 5

Python - это динамически типизированный язык, и, наоборот, c/С++ являются статически типизированными языками. Невозможно найти тип и объявить во время выполнения.