以下基本代碼是一個相當大的程序的一部分有條件初始化一個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