在c++ 17中的if语句中链接多个函数调用



假设我的当前代码是:

if (GetFlag(...)) {
if (auto x = GetX(...)) {
if (auto y = GetY(...)) {
...
}
}
}

,方法调用和变量定义需要按照这个顺序进行,这是为了正确性和性能原因(如果GetFlag(...)返回false,我们不想计算x,如果xnullptr,我们不想计算y)。

是否有办法将其重构为"一行代码"?最接近编译的是

if (auto x = GetX(...); auto x = GetX(...) && GetFlag(...)) { ... }

,但这并不保留操作的顺序。

谢谢!

您可以将条件提取到返回元组的单独函数中,并在if

中进行结构化绑定。
std::tuple<bool, std::optional<X>, std::optional<Y>> getFlagsXY()
{
if (!getFlags())
{
return { false };
}

if (auto x = getX(); !x)
{
return { true, std::move(x) };
}
else 
{
return { true, std::move(x), getY() };
}
}
if (auto [f, x, y] = getFlagsXY(); f && *x && *y) { ... }

是的,这是可能的。If语句一旦看到将要使用哪个分支就停止处理术语。试着改变GetFlag、GetX的值,看看if函数体何时被调用。

#include <iostream>
bool GetFlag()
{
std::cout << "GetFlagn";
return true;
}
int GetX()
{
std::cout << "GetXn";
return 0;
}
int GetY()
{
std::cout << "GetYn";
return 3;
}

int main()
{
int x;
int y;
if (GetFlag() && (x = GetX()) && (y = GetY()))
{
std::cout << "Do " << x << ", " << y;
}
return 0;
}

相关内容

  • 没有找到相关文章