cbu*_*art 8 c++ initialization const c++11
以下基本代码是一个非常大的过程的一部分:
int x = foo();
if (x == 0) x = bar();
Run Code Online (Sandbox Code Playgroud)
x 在其他任何地方都没有修改,所以我可以这样做:
const int x = foo() == 0 ? bar() : foo();
Run Code Online (Sandbox Code Playgroud)
但是这foo()是一个非常昂贵和复杂的功能,所以我不能因为性能和它可能产生竞争条件并因此获得不同的值(它可能涉及读取外部资源)两次调用它.
我想让代码尽可能可读,如果可能的话,尽可能简短.一种选择是:
const int foo_ = foo(), x = foo_ == 0 ? bar() : foo_;
Run Code Online (Sandbox Code Playgroud)
另一方面,我想避免使用这种时间变量,主要是因为foo()可能依赖于外部资源,因此foo_在代码的其余部分中使用缓存值是无效的.
我正在发布我正在使用的解决方案,但我想知道是否有更好的选项(没有或几个代码混乱,在同一范围内没有时间变量,可读性......).提前致谢!
PS:它必须遵循至少C++ 11标准,因为它属于跨平台项目.
我知道它可能是基于意见的,但考虑到先前关于简单性(不是混乱代码)和避免时间变量(不是为了可读性而是为了代码安全性)的陈述,我想知道解决这个问题的选项.
如果您乐意使用gcc扩展,那么您可以写:
const int x = foo() ?: bar();
Run Code Online (Sandbox Code Playgroud)
到目前为止,我找到的解决方案是使用 lambda 函数,例如:
const int x = [](int n) { return n == 0 ? bar() : n; }(foo());
Run Code Online (Sandbox Code Playgroud)
由于这是基于意见的问题,我会选择:
auto get_the_correct_x=[](){
const auto temp=foo();
return temp==0?bar():temp;
}
const auto x=get_the_correct_x();
Run Code Online (Sandbox Code Playgroud)
一个好的名字比get_the_correct_x直接使用 lambda 而不命名会更清晰。