C++ C++;if(!result)的sugar语法返回false;

C++ C++;if(!result)的sugar语法返回false;,c++,syntactic-sugar,C++,Syntactic Sugar,在重构某些代码时,我经常遇到以下情况: bool highLevelFunc foo() { // ... bool result = LesserLevelFunc(); if (!result) return false; // ... Keep having fun if we didn't return } 有没有办法让这更性感,更简洁?当然没有任何开销或陷阱 我能想到一个宏 #define FORWARD_IF_FALSE(r) if (!r) return r;

在重构某些代码时,我经常遇到以下情况:

bool highLevelFunc foo()
{
  // ...
  bool result = LesserLevelFunc();
    if (!result) return false;
  // ... Keep having fun if we didn't return
}
有没有办法让这更性感,更简洁?当然没有任何开销或陷阱

我能想到一个宏

#define FORWARD_IF_FALSE(r) if (!r) return r;

bool highLevelFunc foo()
{
  // ...
  FORWARD_IF_FALSE(LesserLevelFunc());
  // ...
}
还有更好的吗,比如没有预处理器宏?

对我来说,“可读”代码很性感。我发现原始代码比你的建议更可读,因为原始使用标准C++语法,后者使用我必须去查找的宏。 如果您想更明确,您可以说
If(result==false)
(或者更好地说,
If(false==result)
,以防止可能的赋值作为比较错误),但要理解
运算符在我看来是一个相当合理的期望

也就是说,没有理由将返回值指定给临时变量;你可以很容易地说:

if (!LesserLevelFunc()) return false;
这对我来说很容易理解

<> > >编辑< /强>:还可以考虑使用异常而不是返回值来通信失败。如果
LesserLevelFunc()
引发异常,则无需在
highLevelFunc()
中编写任何特殊代码来检查是否成功。异常将通过调用方向上传播到最近的匹配
catch
块。

对我来说,“可读”代码很性感。我发现原始代码比你的建议更可读,因为原始使用标准C++语法,后者使用我必须去查找的宏。 如果您想更明确,您可以说
If(result==false)
(或者更好地说,
If(false==result)
,以防止可能的赋值作为比较错误),但要理解
运算符在我看来是一个相当合理的期望

也就是说,没有理由将返回值指定给临时变量;你可以很容易地说:

if (!LesserLevelFunc()) return false;
这对我来说很容易理解


<> > >编辑< /强>:还可以考虑使用异常而不是返回值来通信失败。如果
LesserLevelFunc()
引发异常,则无需在
highLevelFunc()
中编写任何特殊代码来检查是否成功。异常将通过调用方向上传播到最近的匹配
catch
块。

因为如果
lesserlevefunc
返回true,您可能会继续,我建议将其保持与现在的状态非常接近:

if (!LesserLevelFunc())
    return false;

因为如果
LesserLevelFunc
返回true,您可能会继续操作,因此我建议将其保持在现在的状态:

if (!LesserLevelFunc())
    return false;

首先介绍使代码不安全的宏。此外,您的宏无效

否定运算符后的表达式应括在括号内

#define FORWARD_IF_FALSE(r) if (!( r ) ) return r;
其次,宏调用r两次。有时一个函数的两个调用并不等同于同一个函数的一个调用。例如,函数可能有一些副作用或内部标志,在每次函数调用中打开/关闭


因此,我将保持代码的原样,而不引入宏,因为宏并不等同于原始代码的符号。

首先引入宏会使代码变得不安全。此外,您的宏无效

否定运算符后的表达式应括在括号内

#define FORWARD_IF_FALSE(r) if (!( r ) ) return r;
其次,宏调用r两次。有时一个函数的两个调用并不等同于同一个函数的一个调用。例如,函数可能有一些副作用或内部标志,在每次函数调用中打开/关闭


因此,我将保持代码不变,而不引入宏,因为宏并不等同于原始代码的符号。

@MitchWheat他只想在函数出现故障时返回函数。如果不是false,他想继续。@MitchWheat在原始示例中,真实条件不会“返回”。如果没有看到更多代码,很难说…@MitchWheat我认为这三个点是有意义的。当然,我只想在子函数失败时返回:)您的
FORWARD\u if\u FALSE
计算两次
lesserlevefunc
(如果为FALSE)。它遗漏了
r
@MitchWheat的括号,他只想在函数失败时返回函数。如果不是false,他想继续。@MitchWheat在原始示例中,真实条件不会“返回”。如果没有看到更多代码,很难说…@MitchWheat我认为这三个点是有意义的。当然,我只想在子函数失败时返回:)您的
FORWARD\u if\u FALSE
计算两次
lesserlevefunc
(如果为FALSE)。而且它遗漏了
r
周围的括号。是的,在线检查/返回是一种方式。我同意例外情况,但不一定总是实用的。是的,在线支票/退货是一种方式。我同意例外情况,但不一定总是实用的。