首页 > 编程语言 >[转]c++ function使用方法

[转]c++ function使用方法

时间:2023-08-11 21:12:29浏览次数:45  
标签:function std c++ add num Foo 方法 display

原帖:https://blog.csdn.net/myRealization/article/details/111189651

 cppreference https://en.cppreference.com/w/cpp/utility/functional/function

boost源码剖析之:泛型函数指针类boost::function https://blog.csdn.net/pongba/article/details/1560773

c++模板偏特化 https://zhuanlan.zhihu.com/p/268600376  
#include <functional>
#include <iostream>
 
struct Foo
{
    Foo(int num) : num_(num) {}
    void print_add(int i) const { std::cout << num_ + i << '\n'; }
    int num_;
};
 
void print_num(int i)
{
    std::cout << i << '\n';
}
 
struct PrintNum
{
    void operator()(int i) const
    {
        std::cout << i << '\n';
    }
};
 
int main()
{
    // store a free function
    std::function<void(int)> f_display = print_num;
    f_display(-9);
 
    // store a lambda
    std::function<void()> f_display_42 = []() { print_num(42); };
    f_display_42();
 
    // store the result of a call to std::bind
    std::function<void()> f_display_31337 = std::bind(print_num, 31337);
    f_display_31337();
 
    // store a call to a member function
    std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
    const Foo foo(314159);
    f_add_display(foo, 1);
    f_add_display(314159, 1);
 
    // store a call to a data member accessor
    std::function<int(Foo const&)> f_num = &Foo::num_;
    std::cout << "num_: " << f_num(foo) << '\n';
 
    // store a call to a member function and object
    using std::placeholders::_1;
    std::function<void(int)> f_add_display2 = std::bind(&Foo::print_add, foo, _1);
    f_add_display2(2);
 
    // store a call to a member function and object ptr
    std::function<void(int)> f_add_display3 = std::bind(&Foo::print_add, &foo, _1);
    f_add_display3(3);
 
    // store a call to a function object
    std::function<void(int)> f_display_obj = PrintNum();
    f_display_obj(18);
 
    auto factorial = [](int n)
    {
        // store a lambda object to emulate "recursive lambda"; aware of extra overhead
        std::function<int(int)> fac = [&](int n) { return (n < 2) ? 1 : n * fac(n - 1); };
        // note that "auto fac = [&](int n) {...};" does not work in recursive calls
        return fac(n);
    };
    for (int i{5}; i != 8; ++i)
        std::cout << i << "! = " << factorial(i) << ";  ";
    std::cout << '\n';
}

Possible output:

-9
42
31337
314160
314160
num_: 314159
314161
314162
18
5! = 120;  6! = 720;  7! = 5040;

标签:function,std,c++,add,num,Foo,方法,display
From: https://www.cnblogs.com/barrysgy/p/17623939.html

相关文章

  • 转载 | win11右键改为win10的bat命令(以及恢复方法bat)
    原文来自这里:https://blog.51cto.com/knifeedge/5340751 版权归:IT利刃出鞘  本质上就是写入注册表。 一、右键菜单改回Win10(展开)1.新建文件:win11右键展开.bat2.填写脚本内容regadd"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\Inproc......
  • WEB实战手册-基于C++(1)
    目录oat++oat++oat++是一个轻量级高性能Web服务开发框架,采用纯C++编写而成。特性:特性快速零依赖异步服务器,高性能,在单个服务器上同时处理超过500万个WebSocket连接多线程服务器(简单的API)连接无感知,可以使用任何传输类型,无论是SSL后端、套接字......
  • IIS8.5 Error Code 0x8007007e HTTP 错误 500.19的解决方法
    windowserver2012R2IIS8.5引用:https://www.52jbj.com/yunying/340443.htmlHTTP错误500.19-InternalServerError  无法访问请求的页面,因为该页的相关配置数据无效。    详细错误信息    模块DynamicCompressionModule    通知SendResponse    处......
  • C++欧几里得算法求最大公约数和最小公倍数
    定义最大公约数即为GreatestCommonDivisor,常缩写为gcd。一组整数的公约数,是指同时是这组数中每一个数的约数的数。一组整数的最大公约数,是指所有公约数里面最大的一个。那么如何求最大公约数呢?我们先考虑两个数的情况。欧几里得算法过程如果我们已知两个数\(a\)和\(......
  • 宝塔项目迁移到另外一个宝塔,访问出现错误No input file specified.解决方法
    1.PHP网站项目从测试的宝塔转移到正式的宝塔,项目转移后打开出现错误Noinputfilespecified,查询错误日志/www/wwwlogs/(自己网站的error日志)发现 查询了一下这个错误: 最终发现问题在public文件下的.user.ini 将路径修改为新网址,问题解决 ......
  • 传奇架设服务端传奇GOM引擎不加载插件,写入了不加载的解决方法
    vsftpd(verysecureFTPdaemon)是Linux下的一款小巧轻快、安全易用的FTP服务器软件。本教程介绍如何在Linux实例上安装并配置vsftpd。前提条件已创建ECS实例并为实例分配了公网IP地址。背景信息FTP(FileTransferProtocol)是一种文件传输协议,基于客户端/服务器架构,支持以下两种工作模......
  • 外汇110 :两种最适合兼职交易者的交易方法
    外汇市场对兼职交易员来说是理想的,因为它24小时运作,不断变化,提供了充足的机会在一天中的任何时间获利。然而,外汇市场波动很大。如果没有实施正确的策略,这对所有交易员来说都是有风险的,尤其是兼职交易员。成为一名兼职外汇交易员意味着,你善于利用交易时的机会,而不是利用所有外汇交易......
  • Go数组转换,[]byte、[]unint16互相转换的方法封装,完整范例
    需求:分别封装方法将[]byte转换成[]unint16,将[]unint16转换成[]bytebyte相当于unint8分析:长度为20的[]byte转换为长度为10的[]unint16,他们之间的转换如bytes:=[]byte{0,1}  ===》[0*256+1]=1 注意:第奇数乘256加偶数的值则[]uint16的值为[1]完整代码如下:1pack......
  • MyBatis-Plus批量插入方法saveBatch
    1.saveBatch能否提高插入的效率?先说结论,saveBatch()方法也是一条一条的插入,也就是说它会产生多条insert语句,而不是一条insert语句,所以它不是真正的批量插入,更不能提高插入效率。看看代码就全明白了从代码看,循环一条一条的插入,每次都是一个sqlSession.insert()因此,saveBatch......
  • 传奇架设服务端传奇GOM引擎不加载插件,写入了不加载的解决方法
    MirServer\Mir200下面的PlugList.txt文件里写入了插件dll名称,但是启动服务端时还是不加载,主要是因为是因为插件目录不正确,以下告诉大家解决方法。首先关掉M2,然后打开“D:\MirServer\Mir200\!Setup.txt”文件搜索该文件,搜索关键字是“Plugdir”把搜索到的那一行全部删除就可以了,如......