Можно ли инициализировать переменную с помощью istream на той же строке, которую она объявила?
Можно ли сконденсировать следующие две строки в одну?
int foo;
std::cin >> foo;
Ответ 1
Ответ на умную задницу:
int old; std::cin >> old;
Ужасный ответ:
int old, dummy = (std::cin >> old, 0);
Правильный ответ: old должен быть определен с объявлением, прежде чем он может быть передан в operator>> в качестве аргумента. Единственный способ получить вызов функции в объявлении переменной - поместить ее в выражение инициализации, как указано выше. Принятый способ объявить переменную и прочитать ввод в нее, как вы написали:
int old;
std::cin >> old;
Ответ 2
Вы можете... с помощью
int old = (std::cin >> old, old);
но вы действительно не должны этого делать
Ответ 3
Использование функции:
int inputdata()
{
int data;
std::cin >> data;
return data;
}
Тогда:
int a=inputdata();
Для самих данных:
int inputdata()
{
static bool isDataDeclared=false;
if (isDataDeclared==true)
{
goto read_data;
}
else
{
isDataDeclared=true;
}
static int data=inputdata();
return data;
read_data:
std::cin >> data;
return data;
}
Ответ 4
Возможно, не для int, а для ваших собственных типов:
class MyType {
int value;
public:
MyType(istream& is) {
is >> *this;
}
friend istream& operator>>(istream& is, MyType& object);
};
istream& operator>>(istream& is, MyType& object) {
return is >> object.value;
}
Затем вы можете создать тип с istream, переданным конструктору:
int main() {
istringstream iss("42");
MyType object(iss);
}