gpt4 book ai didi

c++ - 在变量初始化期间使用 C++ lambda 函数

转载 作者:可可西里 更新时间:2023-11-01 18:38:50 26 4
gpt4 key购买 nike

我想你们中的许多人在某处都有这种代码:

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(); });
}();

最佳答案

这在其他语言中是一种相当普遍的技术。 Scheme 的几乎每个高级功能都是根据立即调用的 lambda 定义的。

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

var myModule = (function() {

// declare variables and functions (which will be "private")

return {
// populate this object literal with "public" functions
};

})();

所以一个匿名函数被声明并立即被调用,这样任何内部细节都被隐藏起来,只有返回值被暴露在外部。

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

像 C++ 这样的命令式语言有很多语言特性,它们会受益于能够返回一个值(而不是像 void 函数)。例如,if 有一个替代项,即第三运算符 expr ?一个:乙

在 Ruby 中,几乎所有语句都可以求值,因此不需要单独的语法来提供返回值。如果 C++ 以这种方式工作,这将意味着:

auto result = try
{
getIntegerSomehow();
}
catch (const SomeException &)
{
0;
}

关于c++ - 在变量初始化期间使用 C++ lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3439053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com