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
周围的括号。是的,在线检查/返回是一种方式。我同意例外情况,但不一定总是实用的。是的,在线支票/退货是一种方式。我同意例外情况,但不一定总是实用的。