C++23 中的延迟 lambda

And*_*par 1 c++ raii c++23

我喜欢在个人项目中使用最新的 C++。我想知道如何在最新的 C++ 中延迟 lambda(或使用作用域保护)

下面是一个快速实现。我最喜欢款式3。标准有类似下面的内容吗?我对此有任何非常明显的错误吗?我只花了几分钟写这篇文章

#include<cstdio>
#include<memory>
using namespace std;

template<class T>
class DeferLambda {
    T l;
public:
    DeferLambda(T l) : l(l) { }
    ~DeferLambda() { l(); }
};

auto make_defer(auto p) -> DeferLambda<decltype(p)> { return {p}; }

#define NAME2(A, B) A ## B
#define NAME(A, B) NAME2(A, B)
#define L(X) auto NAME(defer, __LINE__) = make_defer(X);
int main(int argc, char *argv[])
{
    DeferLambda a([]{puts("Style 1");});
    auto b = make_defer([]{puts("Style 2");});
    L([]{puts("Style 3");});
    puts("test");
}
Run Code Online (Sandbox Code Playgroud)

Ted*_*gmo 6

标准有类似下面的内容吗?

不是作为内置语言功能,因此必须像您所做的那样创建一个类并向其添加用户定义的析构函数。该主题有许多变体,例如std::experimental::scope_exit,它不在标准库中,但已建议将其包含在内。

我对此有任何非常明显的错误吗?

这取决于你想要什么。如果这要在作用域末尾用作某种“最后”,那么您可能希望delete能够复制您的DeferLambdas. 否则,有人可能会遇到其中的两件事,当它们超出范围时执行相同的操作。