如何获取 lambda *capture* 函数的 "raw" ptr

How to get the "raw" ptr of a lambda *capture* function

我想使用 lambda 捕获创建一个 C++ 程序集挂钩,但为此我需要获取 lambda capture 函数的指针。

像这样:

int val0 = 42;
auto lambdaCap = new auto([&]() -> int { return val0++; });
uint64_t pLambdaFn = static_cast<uint64_t>(&decltype(*lambdaCap)::operator()); // need this

据我所知,lambda 函数捕获看起来像是带有仿函数的 class 实例,但我想获取 lambda::operator() 的静态地址。在内存中,“lambdaCap”只是 lambda 中使用的变量成员的指针。

谢谢

&decltype(*lambdaCap)::operator()) 无效,因为 decltype(*lambdaCap) 实际上是闭包类型的左值引用。

相反,std::remove_pointer_t<decltype(lambdaCap)> 会给你闭包类型本身。所以你可以写 &std::remove_pointer_t<decltype(lambdaCap)>::operator() 来获取与闭包类型的函数调用运算符对应的指向成员函数的指针。

但是,这个表达式的类型是int (T::*)(),不能转换成整型。您可以按原样存储它,并使用指向闭包类型实例(例如 lambdaCap 本身)的指针调用它,但不能将其转换为 uint64_t。无法将指向非静态成员的指针转换为整数类型,无论是使用 static_castreinterpret_cast 还是任何其他转换。