You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法从持有lambda的std::function获取函数指针?如何修复?

问题解析与解决方法

为什么第二个示例输出0?

  • 普通函数本身属于函数指针类型,赋值给std::function时,容器内部存储的就是bool(*)(int)类型的指针,因此target<my_type>能匹配到对应类型,返回有效指针。
  • 无捕获的lambda虽然可以隐式转换为函数指针,但它本质是一个匿名闭包类型的对象。直接赋值给std::function时,容器存储的是这个闭包对象而非函数指针。此时用target<my_type>查找函数指针类型,无法匹配内部存储的闭包类型,因此返回nullptr,输出0。

修改方法

要让target<my_type>返回有效指针,需让std::function内部存储函数指针类型而非闭包对象,有两种实现方式:

方式一:显式转换lambda为函数指针

#include <functional>
#include <iostream>

using my_type = bool(*)(int);
int main() {
    // 显式将lambda转换为函数指针类型后赋值
    std::function f = static_cast<my_type>([](int) -> bool { return true; });
    auto pointer = f.target<my_type>();

    // 输出1
    std::cout << (pointer != nullptr) << std::endl;
    return 0;
}

方式二:获取闭包类型指针再转换

#include <functional>
#include <iostream>

int main() {
    auto lambda = [](int) -> bool { return true; };
    std::function f = lambda;
    // 获取闭包类型的指针
    auto lambda_ptr = f.target<decltype(lambda)>();
    if (lambda_ptr) {
        // 利用无捕获lambda特性转换为函数指针
        bool(*pointer)(int) = *lambda_ptr;
        std::cout << (pointer != nullptr) << std::endl; // 输出1
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者f9c69e9781fa194211448473495534

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:05:21