gpt4 book ai didi

c++ - C++11 lambda 的参数/存储类型

转载 作者:可可西里 更新时间:2023-11-01 14:53:42 26 4
gpt4 key购买 nike

在 C++11 中,如何声明一个接受 lambda 表达式作为参数的函数?我可以在网上找到大量用于声明 lambda 或将它们作为模板参数的资源,但我真正想做的是能够使用 lambda 作为易于声明的回调处理程序,类似于闭包所实现的功能在 JavaScript 和 Objective-C 中的代码块中。

本质上,我想用 lambda 替换的经典 C++ 构造类似于:

class MyCallback {
public:
virtual ~MyCallback() {}
virtual void operator(int arg) = 0;
};

void registerCallback(const std::shared_ptr<MyCallback> &);

void foo(void) {
int a, b, c;
class LocalCallback: public MyCallback {
int a, b, c;
public:
LocalCallback(int a, int b, int c): a(a), b(b), c(c) {}
void operator(int arg) { std::cout << (a+b+c)*arg << std::endl; }
};
registerCallback(std::shared_ptr<MyCallback>(new LocalCallback(a,b,c)));
}

这将被简化为:

void registerCallback(/* WHAT GOES HERE? */);

void foo(void) {
int a, b, c;
registerCallback([=](int arg){std::cout << (a+b+c)*arg << std::endl; })
}

那么,我写的地方是什么 /* 这里是什么? */?

编辑:这是为了存储回调以供稍后回调,而不是立即使用和调用。

最佳答案

通常 const std::function<void(int)> &std::function<void(int)> .

我不确定关于 std::function 的结论是什么应该通过 const 引用或值传递。可能按值计算很好,特别是因为您无论如何都要将其复制到存储中。

如果在所有语法中间不清楚,void(int)是函数类型,std::function<T>大致意思是“与类型 T 的函数具有相同签名的仿函数”。

Lambda 本身具有匿名 类型。无法命名你的 lambda 表达式的类型,具有相同签名的不同 lambda 表达式的类型是不同的:

auto foo = [=](int arg){std::cout << (a+b+c)*arg << std::endl; };
auto bar = [=](int arg){std::cout << (a+b+c)*arg << std::endl; };
// foo and bar have different types, accessible as decltype(foo), decltype(bar)

因此需要 std::function ,它基本上是一个类型删除包装器,用于将具有相同签名的不同仿函数聚集到一个通用类型中。它是带模板的静态多态性与动态多态性之间的桥梁,如果您想注册一个回调、存储它供以后使用,然后在不“记住”原始类型的情况下调用它。

关于c++ - C++11 lambda 的参数/存储类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727158/

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