繁体   English   中英

使用静态局部变量获取绑定/推断捕获 lambda 的函数指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM