我想你們很多人都有這樣的代碼的地方:使用C變量初始化期間++ lambda函數
int foo;
switch (bar) {
case SOMETHING: foo = 5; break;
case STHNELSE: foo = 10; break;
...
}
但是這個代碼有一些缺點:
- 你可以很容易忘記了「破發」
- 的
foo
變量不是const的,而應該是 - 它只是不漂亮
於是我開始想知道是否有「改善」這種代碼的方式,我得到了這個小想法:
const int foo = [&]() -> int {
switch (bar) {
case SOMETHING: return 5;
case STHNELSE: return 10;
...
}
}();
注:第一對括號它不是強制性的,但MSVC++不支持這個
你可以使用與if-else相同的技巧,其中三元運算符太複雜,需要通過指針傳遞的變量被初始化(如DirectX函數)等。
我的問題是:
- 這段代碼有什麼問題,我沒有看到?
- 你發現它比上面的更好嗎?
- g ++似乎內聯函數,但是您認爲所有編譯器都會這樣做嗎?
編輯:這就是我所說的 「DirectX的功能」
_xAudio2 = [&]() -> std::shared_ptr<IXAudio2> {
IXAudio2* ptr = nullptr;
if (FAILED(XAudio2Create(&ptr, xAudioFlags, XAUDIO2_DEFAULT_PROCESSOR)))
throw std::runtime_error("XAudio2Create failed");
return std::shared_ptr<IXAudio2>(ptr, [](IUnknown* ptr) { ptr->Release(); });
}();
巧妙的把戲!但我會更進一步,並將lambda變成一個名爲「int EnumToFoo(Enum)」的函數:調用函數中的混亂程度較低,並自動用一個描述性良好的名稱進行記錄;)。 – Sjoerd 2010-08-09 10:23:53
我與sjoerd - 我總是重構任何映射函數 - 開關或否則 – StuartLC 2010-08-09 10:32:32
在這種情況下,它可能是值得編碼一個外部函數,但我沒有看到自己創建一個函數只是爲了構建一個DirectX對象,例如 – Tomaka17 2010-08-09 10:59:22