我有几个函数可以尝试评估一些数据。每个函数如果可以成功评估数据,则返回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方法,但感觉好像缺少一些东西。
答案 0 :(得分:1)
void doSomething() {
function1(data) || function2(data) /* || ... more function calls ... */;
}
逻辑或运算符||
恰好具有您需要的属性-从左到右求值,并在一个操作数为true
时立即停止。
答案 1 :(得分:0)
我认为您可以创建一个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; }
您可以根据需要在运行时通过以下方式修改列表:外部对象,文件中的配置设置等...