我想你们很多人都有这样的代码的地方:使用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