iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 如何将Lambda转换成函数指针
  • 990
分享到

C++ 如何将Lambda转换成函数指针

C++ LambdaC++函数指针Lambda转成函数指针 2022-11-13 19:11:45 990人浏览 安东尼
摘要

目录参考下面的代码下面是类型转换运算符实现的一行关键汇编代码没有捕获任何变量的Lambda表达式可以转换成与它的调用原型一致的函数指针。 参考下面的代码 void example1(

没有捕获任何变量的Lambda表达式可以转换成与它的调用原型一致的函数指针。

参考下面的代码

void example1()
{
    auto add = [](int x, int y)
    {
        return x + y;
    };
    int x = 2, y = 3;
    int z1 = add(x, y);                  // 调用Lambda
    int(*f)(int, int) = add;             // Lambda转换成函数指针
    int z2 = f(x, y);                    // 调用函数
    cout << z1 << ", " << z2 << endl;
}

Lambda是实现了函数调用运算符的匿名类(anonymous class)。对于每一个Lambda,编译器创建匿名类,并定义相应的数据成员存储Lambda捕获的变量。没有捕获变量的Lambda不包含任何含成员变量。

一个没有任何成员变量(包括没有虚函数表指针)的类型,在空指针上调用成员函数也不会有任何的问题,因为它的成员函数不会通过this指针访问内存。

当Lambda向函数指针的转换时,编译器为Lambda的匿名类实现函数指针类型转换运算符。

上面的例子中,编译器实现operator int(*)(int, int)。

下面是Visual c++编译器为语句int(*f)(int, int) = add生成的64位汇编代码:

lea         rcx,[add]  
call        <lambda_0e153cdea67ea404383c23c1022dd325>::operator int (__cdecl*)(int,int) 
mov         qWord ptr [f],rax  

第1行,变量"add"的地址存入rcx寄存器;第2行,调用匿名类的函数指针类型转换运算符;第3行,返回结果存入变量f。

提示:在默认的成员函数调用约定__thiscall下,this指针通过rcx寄存器传递, 有关__thiscall的详细内容,请参考:https://docs.microsoft.com/en-us/cpp/cpp/thiscall。

下面是类型转换运算符实现的一行关键汇编代码

lea         rax,[<lambda_0e153cdea67ea404383c23c1022dd325>::<lambda_invoker_cdecl>] 

这一行把匿名类的名为lambda_invoker_cdecl的函数地址存入用于返回结果的寄存器rax。因为只有类的静态函数可以转换成非成员函数指针,所以lambda_invoker_cdecl是静态函数。下面是此函数其中一段汇编代码:

xor         rcx,rcx  
call        <lambda_0e153cdea67ea404383c23c1022dd325>::operator() 

第一行,rcx寄存器清0,即this指针置0;第二行,调用operator()。

综合上面的分析,得出Lambda转换成函数指针的一种可能的实现方式,参考下面的代码:

typedef int(*FUNCADD)(int, int);

// 实现两个整数相加的函数对象
class add_function_object
{
public:
    // 函数调用运算符
    int operator()(int x, int y)const
    {
        return x + y;
    }
    // 函数指针类型转换运算符
    operator FUNCADD()const
    {
        return add;
    }
private:
    static int add(int x, int y)
    {
        add_function_object* obj = nullptr;
        return obj->operator()(x, y);
    }
};

void example2()
{
    int x = 2, y = 3;
    add_function_object add;
    int z1 = add(x, y);
    auto fadd = add.operator FUNCADD();
    int z2 = fadd(x, y);
    cout << z1 << ", " << z2 << endl;
}

从C++17起,没有捕获任何变量的Lambda可以用作值类型模板实参,参考下面的代码:

typedef int (*INTEGER_OPERATION)(int, int);

int do_integer_operation(INTEGER_OPERATION op, int x, int y)
{
    return op(x, y);
}

template <INTEGER_OPERATION op>
int integer_operation_t(int x, int y)
{
    return op(x, y);
}

void example3()
{
    auto add = [](int x, int y)
    {
        return x + y;
    };
    auto sub = [](int x, int y)
    {
        return x - y;
    };
    int z1 = integer_operation_t<add>(2, 3);
    int z2 = do_integer_operation(integer_operation_t<sub>, 2, 3);
    cout << "z1 : " << z1 << ", z2 : " << z2 << endl;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: C++ 如何将Lambda转换成函数指针

本文链接: https://www.lsjlt.com/news/170807.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 如何将Lambda转换成函数指针
    目录参考下面的代码下面是类型转换运算符实现的一行关键汇编代码没有捕获任何变量的Lambda表达式可以转换成与它的调用原型一致的函数指针。 参考下面的代码 void example1(...
    99+
    2022-11-13
    C++ Lambda C++函数指针 Lambda转成函数指针
  • 如何用 C++ lambda 表达式替换函数指针?
    用 lambda 表达式替换函数指针可提升可读性、减少样板代码并提高重用性。具体而言,lambda 表达式采用以下语法:[capture list](parameter list) -&...
    99+
    2024-04-17
    lambda 函数指针 c++ 作用域
  • 如何将函数指针转换为函数对象并反之?
    在 c++++ 中,通过 std::function 模板可将函数指针转换为函数对象:使用 std::function 将函数指针包装成函数对象。使用 std::function::ta...
    99+
    2024-04-18
    函数指针 函数对象 c++
  • C++中如何使用成员函数指针
    C++中如何使用成员函数指针,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一个成员函数的指针指向类中的一个成员函数,并和以前有相同的参数,声明如下:float (...
    99+
    2023-06-17
  • C++如何将二叉搜索树转换成双向循环链表(双指针或数组)
    目录二叉搜索树转换成双向循环链表二叉搜索树与双向链表(C++中等区)解题思路代码展示二叉搜索树转换成双向循环链表 本文解法基于性质:二叉搜索树的中序遍历为 递增序列 。 将二叉搜索...
    99+
    2024-04-02
  • C++ 函数中的 lambda 表达式与函数指针有何区别?
    lambda 表达式和函数指针都是 c++++ 中封装代码的机制,但它们在实现和特性上有所不同:实现方式:函数指针指向函数的内存地址,而 lambda 表达式是内联的匿名代码块。返回类型...
    99+
    2024-04-25
    函数指针 c++
  • C语言中如何使用指针函数和函数指针
    这篇文章给大家介绍C语言中如何使用指针函数和函数指针,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、指针函数当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。格式:...
    99+
    2023-06-17
  • C语言如何使用数组指针与函数指针
    这篇文章主要为大家展示了“C语言如何使用数组指针与函数指针”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何使用数组指针与函数指针”这篇文章吧。函数指针语法定义一个函数指针,并通过函数指针...
    99+
    2023-06-29
  • C++如何将string转换成全小写
    目录如何将string转换成全小写string字符串大小写转换的两种方式第一种方式:下标第二种方式:迭代器如何将string转换成全小写 #include <iostream&...
    99+
    2022-11-13
    C++ string string转换成全小写 string小写转换
  • c语言如何将数字转换成字符串
    今天小编给大家分享一下c语言如何将数字转换成字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。c语言将数字转换成字符串的方...
    99+
    2023-07-04
  • golang如何转换指针类型
    这篇文章主要讲解了“golang如何转换指针类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang如何转换指针类型”吧!在golang中,指针是一个非常强大的特性。指针可以使程序能够...
    99+
    2023-07-05
  • golang如何实现指针转换
    本篇内容介绍了“golang如何实现指针转换”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在golang中,可以利用unsafe包来实现指针...
    99+
    2023-07-04
  • php如何将xml转换成数组
    这篇文章给大家分享的是有关php如何将xml转换成数组的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php将xml转换成数组的方法:首先将xml数据转成object(对象)格式的数据;然后使用json_encod...
    99+
    2023-06-08
  • 如何理解C语言函数传参:指针的指针
    这篇文章主要介绍“如何理解C语言函数传参:指针的指针”,在日常操作中,相信很多人在如何理解C语言函数传参:指针的指针问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解C语言函数传参:指针的指针”的疑惑有所...
    99+
    2023-06-15
  • php如何将json转换成数组
    小编给大家分享一下php如何将json转换成数组,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在php中可以通过json_decode函数将json转换成数组,该...
    99+
    2023-06-14
  • php如何将2.131转换成整数
    这篇文章主要讲解了“php如何将2.131转换成整数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何将2.131转换成整数”吧!php将2.131转换成整数的方法:1、使用floor...
    99+
    2023-06-25
  • JavaScript如何将NodeList转换成数组
    小编给大家分享一下JavaScript如何将NodeList转换成数组,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!将NodeList转换成数组如果你运行docu...
    99+
    2023-06-27
  • 如何将对象转换成数组?
    在 javascript 中将对象转换为数组的方法:使用 object.keys() 获取属性键数组。使用 object.values() 获取属性值数组。使用 map() 和 obje...
    99+
    2024-04-29
    数组 对象 键值对
  • C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针
    目录1、指向函数的指针2、对象指针3、this指针4、指向类的非静态成员的指针5、指向类的静态成员的指针 1、指向函数的指针 函数的代码在内存中的首地址,是由函数名表示的,也就是说函...
    99+
    2024-04-02
  • c++将vector迭代器转换为指针的实现方式
    目录将vector迭代器转换为指针vector与迭代器的使用1. 标准库vector2. 迭代器将vector迭代器转换为指针 定义一个Domain结构体以及容器、迭代器 struc...
    99+
    2022-11-16
    c++ vector迭代器 c++ 迭代器 指针 vector迭代器转为指针
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作