【发布时间】:2016-06-14 06:08:21
【问题描述】:
以下虚拟示例在现实世界中可能没有真正意义。但它解释了这个问题。我有一个class Foo 成员firstname 和lastname。函数 ForEachMessage 采用 lambda。我希望它只捕获Foo 的firstname 而不是lastname。我如何做到这一点?
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
vector<string> messagesList;
void ForEachMessage(function<void(const string&)>callBack)
{
for (const auto& str : messagesList) {
callBack(str);
}
}
class Foo {
public:
std::string firstname;
std::string lastname;
void say() {
ForEachMessage([this](const std::string& someMessage)
{
cout << firstname << ": " << someMessage << endl;
});
// Error: firstname in capture list doesn't name a variable
// ForEachMessage([firstname](const std::string& someMessage)
// {
// cout << firstname << ": " << someMessage << endl;
// });
// Error: expect ',' or ']' in lambda capture list
// ForEachMessage([this->firstname](const std::string& someMessage)
// {
// cout << firstname << ": " << someMessage << endl;
// });
}
};
int main(int argc, const char * argv[]) {
Foo foo;
foo.firstname = "Yuchen";
foo.lastname = "Zhong";
messagesList.push_back("Hello, World!");
messagesList.push_back("Byebye, World!");
foo.say();
return 0;
}
【问题讨论】:
-
“不起作用”是世界上最没用的问题描述。
-
@molbdnilo,感谢 cmets。我也添加了错误消息。
-
Quick fix。不知道是否有更好的方法。
-
为了它的价值,挑选变量可能不值得付出努力。编译器可以很好地解决问题,并且不应该捕获 lambda 未使用的变量。
-
@BaummitAugen,这很有趣!
标签: c++