【发布时间】:2010-08-09 23:59:49
【问题描述】:
我认为你们中的许多人在某处都有这种代码:
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 - 我总是会重构任何映射函数 - 切换或其他方式
-
在这种情况下,编写一个外部函数可能是值得的,但我不认为自己创建一个函数只是为了构建一个 DirectX 对象
-
Herb Sutter 的“Lambdas, Lambdas无处不在”演示文稿中介绍了这一点。 nwcpp.org/images/stories/lambda.pdf 第 32 页,顶部幻灯片。