gpt4 book ai didi

c++ - 如何捕获为 lambda 表达式生成的函数的地址?

转载 作者:行者123 更新时间:2023-12-02 03:26:13 29 4
gpt4 key购买 nike

你知道编译器将 lambda 表达式转换为某种仿函数:

捕获的变量成为该仿函数的数据成员。通过值捕获的变量被复制到仿函数的数据成员中。这些数据成员与捕获的变量等具有相同的常量...

现在我想知道是否有可能捕获幕后编译器生成的这个隐藏对象的地址

我给你一个简单的(错误的)代码片段只是为了表明我的意图:

#include <iostream>

using namespace std;

class MetaData
{
public:
void printAddress()
{
cout << "\n printAddress:Instance of MetaData at &" << this;
}
};

int main()
{
MetaData md1;
cout << "\n &md1 = " << &md1 << "\n";

md1.printAddress();

cout << "\n\n--------------------\n\n";

int i = 5;

auto x = [i]() mutable {
//cout << "\n The address of the functor is &" << this; // ERROR ! ! !
cout << "\n Hello from Lambda ";
cout << "\n &i = " << &i << " ++i ==> " << ++i << endl; };

x(); // executing lambda

auto y = x; // y is constructed with copy ctor

y();

}

Link to Coliru

我希望隐藏仿函数表现得像元数据。

有人可以理清我的思路吗?

感谢您的宝贵时间。

最佳答案

语法为:

auto x = [&](){ std::cout << &x; }; // but it is illegal too:
// variable 'x' declared with deduced type 'auto' cannot appear in its own initializer

可能的解决方法是使用 Y-combinator,例如:

auto x = [i](auto& self) mutable {
cout << "\n The address of the functor is &" << &self;
cout << "\n Hello from Lambda ";
cout << "\n &i = " << &i << " ++i ==> " << ++i << endl; };

x(x); // executing lambda

Demo

关于c++ - 如何捕获为 lambda 表达式生成的函数的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58447661/

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