以下基本代码是一个相当大的程序的一部分有条件初始化一个const变量
const int x = foo() == 0 ? bar() : foo();
但foo()
是一个非常昂贵和复杂的功能,所以我无法将它称为性能的两倍,也可能会产生竞争条件并因此获得不同的值(可能涉及读取外部资源)。
我想尽可能使代码尽可能易读,如果可能的话尽可能短。一种选择是:
const int foo_ = foo(), x = foo_ == 0 ? bar() : foo_;
在另一方面,我想避免那种时间变量,主要是因为foo()
可能依赖于外部资源,因此使用foo_
在代码的其余部分缓存值无效。
我发布了我现在使用的解决方案,但我想知道是否有更好的选项(没有或几个代码混乱,同一范围内没有时间变量,可读性...)。提前致谢! PS:它必须至少遵循C++ 11标准,因为它属于跨平台项目。我知道它可能是基于观点的,但考虑到以前关于简单性(而不是混乱的代码)和避免时间变量(不是为了可读性,而是为了代码安全性)的陈述,我想知道解决这个问题的选项。
最终解决
阅读所有的答案和评论后,我做了轻微的修改,以接受的答案,从而结束如下(注释是开放的进一步细化):
static const auto fn_zero_conditional_init = []() {
const int foo_ = foo();
return foo_ ? foo_ : bar();
};
const int x = fn_zero_conditional_init();
如果代码增长并且我不得不重新使用lambda函数,我会考虑将它移动到匿名命名空间或库范围函数。感谢大家的贡献!
三元运算符在写入时可能看起来更好,但一个月后回到代码中时,它们是破译的噩梦,尤其是如果您自己没有写出它们。可读性并不总是适用于短代码,并且可能需要添加注释 –
请解释为什么您认为“时态”变量阻碍了“代码安全性”,特别是比聪明,难以理解的“技巧”更重要? –
我同意时态变量更容易理解,我只是想避免由于这种变量的存在而使用无效状态的机会(缓存'foo()')的返回值)。这就是为什么我问这个问题,是否有机会获得两全其美:可读性和安全性? – cbuchart