Оцените несколько bools, разбейте на первый верный c ++ - PullRequest
0 голосов
/ 23 октября 2011

Все, быстро и легко здесь ...

Я пишу функцию Evaluate, которая запускает множество других функций bool. Прямо сейчас я делаю цикл if, else if (см. Ниже). Любые предложения о другом способе сделать это ??? Я предполагаю, что мог бы сделать это с помощью переключателя, но никогда не использовал их раньше, как это.

int i = 78;

if (isPrime(i))
{
     cout <<"is prime" << endl;
     return;
}

else if (ismultipleOf23(i))
{
    cout <<"is a multiple of 23" << endl;
    return;
}

else if (isEven(i))
{
    cout <<"is Even" << endl;
    return;
}

else if (isOdd(i))
{
    cout <<"is Odd" << endl;
    return;
}

Ответы [ 4 ]

3 голосов
/ 23 октября 2011

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

То, что вы делаете, - правильный путь.

1 голос
/ 23 октября 2011

Это не стоит того, чтобы так мало тестов, но если у вас было много тестов, вы могли бы поместить их в список и перебрать их:

#include <iostream>
#include <string>
using namespace std;

struct TEST {
    bool (*func)(int);
    string msg;
};

bool isMult23(int i) { return i % 23 == 0; }
bool isEven(int i) { return i % 2 == 0; }
bool isOdd(int i) { return !isEven(i); }
bool isOther(int i) { return true; } // sentinel, always true

TEST test[] = {
    isMult23,"is multiple of 23",
    isEven,"is even",
    isOdd,"is odd",
    isOther,"is something else"
};

string eval(int value)
{
    int i = 0;
    while(!test[i].func(value))
        i++;
    return test[i].msg;
}

int main()
{
    cout << eval(46) << endl;
    cout << eval(78) << endl;
    cout << eval(81) << endl;
    return 0;
}

выход

is multiple of 23
is even
is odd
1 голос
/ 23 октября 2011

Вы можете удалить все возвраты, и вам не нужно проверять нечетность, потому что если она не четная, она должна быть нечетной.

int i = 78;

if (isPrime(i))
{
   cout <<"is prime" << endl;
}
else if (ismultipleOf23(i))
{
  cout <<"is a multiple of 23" << endl;
}
else if (isEven(i))
{
  cout <<"is Even" << endl;
}
else
{
  cout <<"is Odd" << endl;
}
return;  // This is also optional
0 голосов
/ 23 октября 2011

Вы могли бы сделать несколько сумасшедших вещей с шаблонами, лямбдами и т. Д., Которые позволили бы вам легко добавлять новые тесты и циклически проходить через набор тестов, выполняя лямбду при успехе и возвращая ...

Но это было бы излишним и потребовало бы немного совместимого со стандартом компилятора (поскольку C ++ 11 теперь является стандартом, я доволен этим утверждением).

...