Как избавиться от повторений условий внутри if

96
31 мая 2021, 00:50

У меня есть много разных условий по типу

if(...код 0..)
{
  throw WSAException();
}
if(...код 1..)
{
  throw WSAException();
}
if(...код 2..)
{
  throw WSAException();
}
if(...код 3..)
{
  throw WSAException();
}

и т.д

как видите throw WSAException(); постоянно повторяется Я бы хотел написать эту функцию один раз для всех условий.

Answer 1

Пользуемся тем, что если уж сгенерировалось исключение - все остальные if не проверяются.

Самое время вспомнить о сокращенном вычислении - в

if (a || b || с ...)

при первом же истинном выражении все остальные не вычисляются. Так что...

if (код1 || код2 || код3 ...) throw...

Не понимаю, что вы хотите в точности, но напишите макрос - типа

#define THROWIF(x) if (x) { throw 1; }

или

#define THROWIF(x,y) if (x) { throw y; }

Update

Если и это не убедит - тогда уж не знаю совсем...

#include <iostream>
#include <iomanip>
using namespace std;
int error()
{
    cout << "Error  ";
    return 0;
}
void f1(int a, int b, int c)
{
    if (cout << "1", a > b) throw error();
    if (cout << "2", b > c) throw error();
    if (cout << "3", a < c) throw error();
    cout << "All right 1   ";
}
void f2(int a, int b, int c)
{
    if ((cout << "1", a > b) || (cout << "2", b > c) || (cout << "3", a < c)) throw error();
    cout << "All right 2   ";
}

int main(int argc, const char * argv[])
{
    for(int a = 1; a <= 3; ++a)
    {
        for(int b = 1; b <= 3; ++b)
        {
            for(int c = 1; c <= 3; ++c)
            {
                cout << a << b << c << ":  ";
                try
                {
                    f1(a,b,c);
                }
                catch(...) {}
                try
                {
                    f2(a,b,c);
                }
                catch(...) {}
                cout << endl;
            }
        }
    }
}
Answer 2

Вы можете воспользоваться "проваливающимся" switch-case:

switch(код){
   case код_0:
   case код_1:
   case код_2:
   case код_3:
      throw WSAException();
      break;
}
READ ALSO
Visual Studio 2019, вопрос по обозревателю решений

Visual Studio 2019, вопрос по обозревателю решений

Не могу понять, для чего обозреватель решений Visual Studio 2019 имеет разделы Исходные файлы и Файлы заголовков

85
Как мне убрать повторения ненужного кода внутри условия?

Как мне убрать повторения ненужного кода внутри условия?

Все привет :) будьте внимательны пожалуйста

101
Можно ли сделать модификацию функции Эйлера?

Можно ли сделать модификацию функции Эйлера?

Как известно, функция Эйлера ищет количество взаимно простых чисел с N на отрезке [1N]

95
QMediaPlayer / задержка перед воспроизведением

QMediaPlayer / задержка перед воспроизведением

Занялся написанием небольшой игрушки и вот добравшись до музыкально-звуковой составляющий столкнулся с проблемой

107