If statement 有没有更好的方法让这个软件流畅
我有几个函数来尝试和评估一些数据。如果每个函数能够成功计算数据,则返回1;如果不能,则返回0。函数一个接一个地调用,但如果返回值为1,则应停止执行 示例函数如下所示: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) {
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成功){coutfunction1(data)| | function2(data)
这是可以做到的,但是如果函数中有很多条件,那么这将是一个很长的过程,这是否也保证了函数将按照插入的顺序被调用?“如果函数中有很多条件,那么很长时间”这是一个问题?“这是否保证将按顺序调用这些函数“是的,确实如此。这并不是一个问题,但我以前遇到过很长的if语句,它们有时是相当难以理解的,然而,因为这只是一个解决问题的函数调用列表,我不认为这有这个问题。作为答案被接受,因为这似乎是最简单的方法。