C++ 使用C++;变量初始化期间的lambda函数

C++ 使用C++;变量初始化期间的lambda函数,c++,lambda,c++11,C++,Lambda,C++11,我想你们中的许多人都有这样的代码: int foo; switch (bar) { case SOMETHING: foo = 5; break; case STHNELSE: foo = 10; break; ... } 但该代码有一些缺点: 你很容易忘记“休息” foo变量不是常量,而应该是常量 只是不漂亮 所以我开始想是否有办法“改进”这类代码,我有了一个小小的想法: const int foo = [&]() -> int { switch (ba

我想你们中的许多人都有这样的代码:

int foo;
switch (bar) {
  case SOMETHING: foo = 5;  break;
  case STHNELSE:  foo = 10; break;
  ...
}
但该代码有一些缺点:

  • 你很容易忘记“休息”
  • foo
    变量不是常量,而应该是常量
  • 只是不漂亮
所以我开始想是否有办法“改进”这类代码,我有了一个小小的想法:

const int foo = [&]() -> int {
  switch (bar) {
    case SOMETHING: return 5;
    case STHNELSE:  return 10;
    ...
  }
}();
注意:第一对括号不是必需的,但是MSVC++还不支持

对于三元运算符过于复杂的if-else、需要通过指针传递才能初始化的变量(如DirectX函数),可以使用相同的技巧

我的问题是:

  • 这个代码有什么我没有看到的错误吗
  • 你觉得它比上面的好吗
  • g++似乎在内联函数,但您认为所有编译器都会这样做吗
编辑:这就是我所说的“DirectX函数”

\u xAudio2=[&]()->std::shared\u ptr{
IXAudio2*ptr=nullptr;
if(失败(XAudio2Create(&ptr、xAudioFlags、XAUDIO2\u DEFAULT\u处理器)))
抛出std::运行时_错误(“XAudio2Create失败”);
返回std::shared_ptr(ptr,[](IUnknown*ptr){ptr->Release();});
}();

这是其他语言中相当常见的技术。几乎Scheme的每个高级特性都是根据立即调用的lambda定义的

在JavaScript中,它是“模块模式”的基础,例如

因此,一个匿名函数被声明并立即调用,因此任何内部细节都被隐藏,只有返回值被公开在外部

唯一的缺点是,在随意阅读代码时,
return
语句似乎是从外部函数返回的(在Java lambda战争期间对此存在激烈的争论)。但是,一旦你的语言有了lambdas,你就必须习惯这一点

<> P> C++中的命令语言中有很多语言特征,这将得益于能够返回一个值(而不是像<代码> Value/Cuffo>函数)。例如,
如果
有另一个选项,则第三级运算符
expr?a:b

在Ruby中,几乎所有语句都可以计算,因此不需要提供返回值的单独语法。如果C++这样做,这将意味着:
auto result = try
{
    getIntegerSomehow();
}
catch (const SomeException &)
{
    0;
}

我看不出有任何理由在这种情况下使用开关盒。任何像样的编译器都会使用if语句生成与使用switch case一样快的代码

if(bar == SOMETHING)
   foo = 5;
else if(bar == STHNELSE)
   foo = 10;

妙计!但我会更进一步,将lambda转换成一个命名函数“int enumtoo(Enum)”:减少调用函数中的混乱,并用一个良好的描述性名称自动记录;)。我支持sjoerd——我总是重构任何映射函数——开关或其他方式在这种情况下,编写一个外部函数可能是值得的,但我并不认为我自己创建一个函数只是为了构建一个DirectX对象——例如,这在Herb Sutter的“Lambdas,Lambdas everywhere”演示中介绍过。第32页,顶部幻灯片。谢谢,我不太习惯使用函数式语言
auto result = try
{
    getIntegerSomehow();
}
catch (const SomeException &)
{
    0;
}
if(bar == SOMETHING)
   foo = 5;
else if(bar == STHNELSE)
   foo = 10;