gpt4 book ai didi

c++ - 使用静态局部变量获取绑定(bind)/推断捕获 lambda 的函数指针

转载 作者:行者123 更新时间:2023-12-02 10:22:38 25 4
gpt4 key购买 nike

是否可以使用静态局部变量获取捕获 lambda 的 C 样式函数指针?

我正在尝试将派生函数的第一个参数绑定(bind)到 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)
    {
    // ...
    });

    在哪里 originalvoid(*)(int, double) 类型和 entry_hook可以公开一个指向传入 lambda 的函数指针

    引用:

    此答案将捕获 lambda 转换为函数指针 C++ lambda with captures as a function pointer

    这个答案将 lambda 转换为函数指针 Obtaining function pointer to lambda?

    最佳答案

    不:这是不可能的。

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

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

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

    几乎作为(可变参数)模板函数(更准确地说:作为带有可变参数模板 operator() 的结构)作为
    template <typename ... As>
    SomeRetType func (As && ... as)
    { /* do something */ }

    你不能有来自 func() 的指针
    auto fp = &func;  // same problem

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

    关于c++ - 使用静态局部变量获取绑定(bind)/推断捕获 lambda 的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59452629/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com