В 17 стандарте появилась возможность инициализировать переменную внутри условия if (init; condition)
Значит я могу сделать так
if(int i =12; d < i){}
или так if(int i,b = 10; i == b) {}
Но как проинициализировать некоторое количество переменных разных типов?
Ответ тот же самый, что и для множественных объявлений в for
: C++, более одного объявления в выражении инициализации цикла for
Элегантного способа нет, но кому-то может понравиться вариант со structured binding
if (auto [a, b] = std::make_tuple(4, 3.14); a == b)
std::cout << "Yay! Pi is " << a << "!" << std::endl;
else
std::cout << "Nay... Pi is not " << a << "..." << std::endl;
Ну как мед, так ложкой...
Или "дайте воды попить, а то так есть хочется - даже переночевать негде!"...
Воспользуйтесь структурой, например:
if (struct { int i; double d; } x = {5, 4.5}; x.i > 5 && x.d < 4)
{
}
Update
Почему я не сторонник применения сруктурного связывания... Потому что по размеру имеем примерно то же, а вот по типам...
Сравните, например:
if (auto[a,b] = make_tuple(1,"ddd"); a > 0)
{
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
}
if (struct { double a; string b; } x = {1,"ddd"}; x.a > 0)
{
cout << typeid(x.a).name() << endl;
cout << typeid(x.b).name() << endl;
}
Здесь нужно предельно точно представлять себе, что именно и как именно инициализируется - скажем, не забыть дописать к 1 точку, или s
к "ddd"
...
Чем бы дитя не тешилось... Такое было давно в 199...
// g++ -Wall -std=c++98 if_pr.cpp
# include <iostream>
# define If(A,B,C,D) {A {if(B){C} else{ D}}}
int f(void){
If(int x=0;int y=1;int z=2;int v=x+y+z;,v>0,
return v;,
return 0;)}
int main(){
std::cout<<"f="<<f()<<"\n";
}
Это просто шутка...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Подскажите, как запустить бесконечный цикл добавления у убирания класса?
Хочу с помощью деревьев выражений LINQ сгенерировать делегат, который будет делать конкатенацию всех строковых свойств произвольного типа: