If statement 有没有更好的方法让这个软件流畅

If statement 有没有更好的方法让这个软件流畅,if-statement,c++14,If Statement,C++14,我有几个函数来尝试和评估一些数据。如果每个函数能够成功计算数据,则返回1;如果不能,则返回0。函数一个接一个地调用,但如果返回值为1,则应停止执行 示例函数如下所示: int function1(std::string &data) { // do something if (success) { return 1; } return 0; } int function2(std::string &data) {

我有几个函数来尝试和评估一些数据。如果每个函数能够成功计算数据,则返回1;如果不能,则返回0。函数一个接一个地调用,但如果返回值为1,则应停止执行

示例函数如下所示:

int function1(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return 0;
}

int function2(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return 0;
}
... more functions ...
如何最清晰地组织这一流程?我知道我可以使用if语句:

void doSomething(void)
{
    if (function1(data))
    {
        return;
    }
    if (function2(data))
    {
        return;
    }
    ... more if's ...
}
但这似乎冗长,而且有大量需要键入的if。我想到的另一个选择是从函数的返回0调用下一个函数,如下所示

int function1(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return function2(data);
}

int function2(std::string &data)
{
    // do something
    if (success)
    {
        return 1;
    }
    return function3(data);
}
... more functions ...
使调用更简洁,因为您只需调用function1()即可进行所需的计算,但这似乎会使代码更难维护。如果需要在流的中间插入另一个检查,或者调用的顺序发生变化,那么新检查之后的所有函数都需要更改以考虑它

<>我缺少一些聪明的C++实现这种程序流程的方法,或者是这些方法中最好的一种。我现在倾向于使用if方法,但我觉得我遗漏了一些东西

void doSomething() {
    function1(data) || function2(data) /* || ... more function calls ... */;
}

逻辑or
|
运算符恰好具有您所需的属性-从左到右求值,并在一个操作数
为true时停止

我认为您可以创建一个lambda向量,其中每个lambda包含有关如何计算数据的特定过程。像这样的

std::vector<std::function<bool(std::string&)> listCheckers;

listCheckers.push_back([](std::string& p_data) -> bool { return function1(p_data); });
listCheckers.push_back([](std::string& p_data) -> bool { return function2(p_data); });
listCheckers.push_back([](std::string& p_data) -> bool { return function3(p_data); });
//...and so on...

//----------------------------- 
std::string theData = "Hello I'm a Data";

//evaluate all data
bool bSuccess = false;
for(fnChecker : listCheckers){
    if(fnChecker(theData)) {
        bSuccess = true;
        break;
    }
}

if(bSuccess ) { cout << "A function has evaluated the data successfully." << endl; }
std::vector bool{return function1(p_data);};
push_back([](std::string&p_数据)->bool{return function2(p_数据);});
push_back([](std::string&p_数据)->bool{returnfunction3(p_数据);});
//……等等。。。
//----------------------------- 
std::string theData=“你好,我是数据”;
//评估所有数据
bool bsucces=假;
用于(fnChecker:ListChecker){
如果(fn检查程序(数据)){
b成功=真;
打破
}
}

如果(b成功){cout
function1(data)| | function2(data)
这是可以做到的,但是如果函数中有很多条件,那么这将是一个很长的过程,这是否也保证了函数将按照插入的顺序被调用?“如果函数中有很多条件,那么很长时间”这是一个问题?“这是否保证将按顺序调用这些函数“是的,确实如此。这并不是一个问题,但我以前遇到过很长的if语句,它们有时是相当难以理解的,然而,因为这只是一个解决问题的函数调用列表,我不认为这有这个问题。作为答案被接受,因为这似乎是最简单的方法。