评估几个bool,打破第一个真正的c ++

时间:2011-10-23 14:55:20

标签: c++ switch-statement if-statement

这里所有,快捷方便......

我正在编写一个运行其他bool函数的Evaluate函数。现在,我基本上做了一个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 个答案:

答案 0 :(得分:3)

您不能使用开关,因为标签必须是常量。

你正在做的是正确的方法。

答案 1 :(得分:1)

你可以删除所有的回报,你不需要检查奇数,因为如果它不是偶数,那就必须是奇数。

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

答案 2 :(得分:1)

对于这么少的测试来说这是不值得的,但是如果你有很多测试,你可以把它们放在一个列表中并迭代它们:

#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

答案 3 :(得分:0)

你可以用模板,lambdas等做一些疯狂的事情,这样你就可以轻松添加新测试并循环测试,成功执行lambda并返回......

但这样做太过分了,需要一个符合标准的编译器(因为C ++ 11现在已成为标准,我对这个声明感到满意)。