在 lambda 闭包上应用移动
apply move on a lambda closure
这可能是
一个概念性问题。我正在实现以lambda
作为参数的函数。但是,我无法理解lambda
的确切类型.例如:
auto T = [] () { printf("hello worldn"); };
auto F = move(T);
T(); // print "hello world"
F(); // print "hello world"
我以为在T
上打电话给move
后,T
的内容消失了。换句话说,我期望以下行为:
function<void> T = [] () { printf("hello worldn");};
auto F = move(F);
F(); // print "hello world"
T(); // throw error
回到最初的问题,将lambda
传递给/分配function<void()>
的类成员的最佳实践是什么?我看到了许多不同的答案,有些使用const function<void()>&
,有些建议模板F&&
struct Foo {
function<void()> f;
// Option 1:
void set_f(const function<void()>& in) {f=in;}
// Option 2: template
template <typename F>
void set_f(F&& in) { // what to write here??? }
}
这两个选项是否足够通用,可以捕获大多数输入类型?
您似乎对编译器使用 lambda 表达式做什么有一个基本的误解。Lambda 表达式将转换为具有唯一名称的函子。当您调用 lambda 时,您只是在调用函子的operator()
。
所以你的第一个例子中的lambda将创建类似这样的东西
struct __uniquely_named_lambda
{
void operator()() const
{
printf("hello worldn");
}
};
如果这个 lambda 存储任何状态,那么从中move
会移动状态,但你的 lambda 是无状态的,所以move
什么都不做;你不能剥离operator()
的主体并将其移动到其他地方。
例如,这些语句将生成输出4 0 4
std::string s{"Test"};
auto T = [s]() { std::cout << s.size() << ' '; }; // make a copy of s
T();
auto F = std::move(T);
T();
F();
现场演示
std::function
是一个容器,可以接受与指定签名匹配的任何可调用对象,而您的 lambda 就是这样一种可调用对象。当您move
std::function
时,您将它存储的可调用目标移动到目标中。尝试在原始目标上调用目标会抛出bad_function_call
,这与move
lambda 非常不同。
我会把你写set_f
成员函数
template <typename F>
void set_f(F&& in)
{
f = std::forward<F>(in);
}
示例中F
是转发引用,这意味着它将能够接受调用方传递的左值或右值。然后,赋值将复制赋值或移动赋值参数。
相关文章:
- 编译对移动应用的影响?
- 在跨平台桌面/移动应用程序套件中使用 ZeroMQ 来解决架构问题
- 如何在从模板类继承时应用移动语义
- 将函数从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误
- 我可以将C++代码(或用C++编写的库)与混合移动应用程序代码混合使用吗
- 将条纹集成到QT移动应用程序中
- QT通过单击Menubar C 移动整个窗口/应用程序
- 适用于桌面和移动应用程序的Qt
- 使用Marmalade(C++)开发移动应用程序
- 如何从QT移动应用程序发送和接收Symbian的短信?
- 带有OpenGL和嵌入式WebViews的本机移动应用程序(iOS/Android)的测试框架
- 如何使用常见的C 业务逻辑和数据访问层构建跨平台移动应用程序
- 平台抽象层(PLA),用于使用c++的移动应用程序
- 在Gnome或KDE中以编程方式移动桌面上的应用程序窗口
- 绘制移动图标,它一直是最顶端的鼠标光标和工作的全屏应用程序
- 在 lambda 闭包上应用移动
- 在C++应用程序中使用Azure移动服务
- 如何将 AndroidManifest.xml 添加到 Project 后将应用部署到移动设备
- 将类从应用程序解决方案移动到静态库解决方案会产生无法解决的外部符号链接错误
- 是否可以使用代码::块作为移动应用程序开发的IDE