在我的代码中,我使用了来自Scott Meyers Effective Modern C ++的Item 32建议,在那里他解释了如何在C ++ 11中进入捕获。示例代码运行良好。
class Some
{
public:
void foo()
{
std::string s = "String";
std::function<void()> lambda = std::bind([this](std::string& s) {
bar(std::move(s));
}, std::move(s));
call(std::move(lambda));
}
void bar(std::string)
{
// Some code
}
void call(std::function<void()> func)
{
func();
}
};
int main()
{
Some().foo();
}
然后我尝试使用参数以更困难的方式在捕获中使用move,但它不起作用,存在一些编译错误。请帮我修理一下。代码有错误如下。我玩过它,但找不到解决方案。有可能吗?
class Some
{
public:
void foo()
{
std::string stringToMove = "String";
std::function<void(std::string, int, int)> lambda =
std::bind([this](std::string s, int i1, int i2, std::string& stringToMove) {
bar(std::move(stringToMove), i1, i2);
}, std::move(stringToMove));
call(std::move(lambda));
}
void bar(std::string, int, int)
{
// Some code
}
void call(std::function<void(std::string, int, int)> func)
{
func(std::string(), 5, 5);
}
};
int main()
{
Some().foo();
}
错误:
严重级代码描述项目文件行抑制状态 错误C2672'std :: invoke':没有匹配的重载函数 发现草稿c:\ program files(x86)\ microsoft visual studio 14.0 \ vc \ include \ type_traits 1468
严重级代码描述项目文件行抑制状态 错误C2893无法专门化功能模板'unknown-type std :: invoke(_Callable&amp;&amp;,_ Types&amp;&amp; ...)'草稿c:\ program files (x86)\ microsoft visual studio 14.0 \ vc \ include \ type_traits 1468
答案 0 :(得分:6)
std::bind
要求您指定所有参数。那些应该传递给结果函数对象的东西需要是占位符。
std::function<void(std::string, int, int)> lambda =
std::bind([this](std::string s, int i1, int i2, std::string& stringToMove) {
bar(std::move(stringToMove), i1, i2);
}, _1, _2, _3, std::move(stringToMove));