为何无法从持有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
相关产品推荐
相关产品推荐

