Есть ли способ применить оператор if ко всем переменным в C ++

если операторы обычно реализуются как if(variable > value) что если у меня есть несколько значений, и все они имеют операцию, например, операцию декремента, и я хочу, чтобы, если любое из этих значений достигает 0, программа должна заменить его на 100 Есть ли простой способ сделать это?

Всего 4 ответа


Вы не можете сделать это обычным образом, if но если у вас есть контейнер, содержащий ваши значения, вы можете использовать std::transform и желаемое условие, чтобы сделать следующее

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> vec = {1,4 ,-7, 0 ,-9, 9};//The container of the values
    //the following line does every thing
    std::transform(vec.begin(), vec.end(), vec.begin(), [](const int& i){return (i < 0)? 100:i; });
    //To display
    for(auto& el : vec)
        std::cout<< el << " ";

}

И это еще один ответ, вдохновленный ответом @ user2962393

#include <iostream>

void cond(int & h){
    if( h < 0 )
        h=100;
}
template<typename T, typename... Ts>
void set_100_if_cond(T& x, Ts&... xs) {
    (cond(x), ... , cond( xs ));
}

int main() {
    int var1 {50};
    int var2 {0};
    int var3 {-9};
    set_100_if_cond(var1, var2, var3);
    std::cout << var1 << " " << var2 << " " << var3;
}

Начиная с C ++ 11 вы можете написать

#include <algorithm>
#include <initializer_list>
if (std::max({a, b, c, d, ..., z}) > value){
}

конечно, при условии, что все переменные от a до z имеют одинаковый тип; вы можете разыграть их, если нет. ... используется здесь типографски; вставьте ваши фактические имена переменных.


Если все элементы находятся в контейнере, вы можете использовать std :: any_of . В противном случае вы можете поместить указатели на них в контейнер и использовать тот же алгоритм. Если вы не хотите этого делать, вам, возможно, придется просто напечатать все это или проявить творческий подход.


если любое из этих значений достигает 0, программа должна заменить его на 100.

Один из способов решения этой проблемы - использование шаблонов с переменными числами и рекурсии (C ++ 11):

#include <iostream>

template<typename T>
void set_100_if_0(T& x) {
   if (x == 0) x = 100;
}

template<typename T, typename... TT>
void set_100_if_0(T& x, TT&... xx) {
    set_100_if_0(x);
    set_100_if_0(xx...);
}

int main() {
    int foo = 42;
    int bar = 0;
    int baz = 99;
    set_100_if_0(foo, bar, baz);
    std::cout << bar << std::endl;
}

Программа напечатает 100.

Есть ли простой способ сделать это?

Нет. В C ++ нет ничего простого.


Есть идеи?

10000