1

是否可以使用静态局部变量获取捕获 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)
{
  // ...
});

whereoriginal是类型void(*)(int, double)并且entry_hook可以将函数指针暴露给传入的 lambda


参考:

此答案将捕获 lambda 转换为函数指针C++ lambda,将捕获作为函数指针

这个答案将 lambda 转换为函数指针获取指向 lambda 的函数指针?

4

1 回答 1

1

不:这是不可能的。

因为您尝试转换为函数指针的 lambda

[](auto && ... args) { /* something */ }

是一个泛型(和可变参数;但关键是这是一个泛型)lambda。

几乎作为(可变参数)模板函数(更准确地说:作为其中包含可变参数模板的结构operator())就像

template <typename ... As>
SomeRetType func (As && ... as)
 { /* do something */ }

你不能有一个指针func()

auto fp = &func;  // same problem

因为func()不是一个对象,而是一组对象。

于 2019-12-23T09:19:50.750 回答