[英]obtain function pointer of bound/inferred capturing lambda with static local variable
是否可以使用静态局部变量获取捕获 lambda 的 C 样式函数指针?
我试图将派生函数的第一个参数绑定到original
参数
template <typename F>
class entry_hook
{
public:
entry_hook(void* original, F&& hook)
{
static auto bound = [&](auto&&... args)
{
return hook(original, std::forward<decltype(args)>(args)...);
};
auto* function_ptr = +[](auto&&... args) // -> decltype(bound(std::forward<decltype(args)>(args)...))
{
return bound(std::forward<decltype(args)>(args)...);
};
}
};
使用:
const auto hook = entry_hook(nullptr, [](void* original)
{
// ...
});
编译失败 - 无法将闭包转换为函数指针
从包装 lambda 中删除参数包(通过更改以下行):
auto* function_ptr = +[](auto&&... args)
到auto* function_ptr = +[]()
return bound(std::forward<decltype(args)>(args)...);
return bound();
成功编译并运行,尽管我假设通过使用可以在编译时对 lambda 进行推断的参数包,不会导致该 lambda 成为这样的闭包(无法转换为函数指针,因为它需要一个语境)
我理想地试图实现:
const auto hook = entry_hook(nullptr, [](auto original, int param1, double param2)
{
// ...
});
其中original
的类型为void(*)(int, double)
并且entry_hook
可以公开指向传入的 lambda 的函数指针
参考:
此答案将捕获的 lambda 转换为函数指针C++ lambda,并将捕获作为函数指针
此答案将 lambda 转换为函数指针获取指向 lambda 的函数指针?
不:这是不可能的。
因为您尝试转换为函数指针的 lambda
[](auto && ... args) { /* something */ }
是一个泛型(和可变参数;但关键是这是一个泛型)lambda。
所以几乎就像一个(可变参数)模板函数(更准确地说:作为一个带有可变参数模板operator()
的结构)作为
template <typename ... As>
SomeRetType func (As && ... as)
{ /* do something */ }
并且您不能从func()
获得指针
auto fp = &func; // same problem
因为func()
不是一个对象,而是一组对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.