如何获取 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_cast
或 reinterpret_cast
还是任何其他转换。
我想使用 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_cast
或 reinterpret_cast
还是任何其他转换。