如何在 lambda 表达式中捕获单个类数据成员?
Posted
技术标签:
【中文标题】如何在 lambda 表达式中捕获单个类数据成员?【英文标题】:How to capture a single class data member in a lambda expression? 【发布时间】:2015-06-04 20:34:00 【问题描述】:我知道以下问题:C++11 lambdas: member variable capture gotcha。此外,我知道需要通过捕获 this
指针来捕获类成员,正如该问题的答案所明确指出的那样。
是的。捕获成员变量总是通过捕获这个来完成的;这是访问成员变量的唯一方法。
但是,捕获this
指针捕获所有类成员。是否可以限制捕获哪些类成员?例如,是否可以捕获单个类成员?
我知道以下方法行不通,但有可能实现吗?
class Foo
public:
Foo() : mBar1(1), mBar2(2)
void doBar()
auto test = [this->mBar1]()
std::cout << mBar1 << "\n";
// Trying to access 'mBar2' here would fail to compile...
;
test();
int mBar1;
int mBar2;
;
来自cmets:
为什么需要这个?
我不需要 这样做。我只是想了解这是否可行,如果可行,该怎么做。
【问题讨论】:
为什么需要这个?你不能相信自己吗? @EdHeal 这个问题不一定是关于 需要 与了解它是否可能/如何做到这一点。但是,我认为自记录 lambda 表达式有一些价值,可以清楚地说明捕获的状态、捕获方式(即通过值/引用)以及捕获状态的来源。 【参考方案1】:使用 C++11,您必须捕获 this
。
但是,在 C++14 中,您可以通过值捕获任意表达式:
[mBar1 = this->mBar1]() ...
或参考:
[&mBar1 = this->mBar1]() ...
【讨论】:
@Brian 我目前仅限于 C++11 编译器。但是,您是正确的,我对 C++11 标记的使用并不意味着我不想知道这在 C++14 或任何其他未来/提议的 C++ 标准中是可能的,但它是合适的声明它在 C++11 中是不可能的。 问题可能被标记为“C++11”,但要意识到这一点:C++14 增加了一个解决方案,如果 C++11 中已经有一个好的解决方案就不会发生这种情况。我们无法证明否定的,但这至少可以可信不存在 C++11 解决方案。【参考方案2】:如果你能够使用 C++14 编译器,你可以使用
auto test = [&bar = this->mBar1]()
std::cout << bar<< "\n";
;
如果您仅限于使用 C++11 编译器,则必须捕获 this
。
【讨论】:
以上是关于如何在 lambda 表达式中捕获单个类数据成员?的主要内容,如果未能解决你的问题,请参考以下文章