当前位置: 首页 > news >正文

C++11 std::function 基础用法

        std::function是C++11标准库中提供的一种可调用对象的通用类型,它可以存储任意可调用对象,如函数指针,函数对象,成员函数指针和lambda表达式。std::function类模板是一个类似于函数指针的类型,但它是可以处理任意可调用对象的,并且可以检查调用对象是否为空。

目录

一、std::function基本介绍

二、进阶使用方法

2.1 与智能指针相结合

2.2 存储成员函数指针

2.3 存储std::bind

三、注意tips


一、std::function基本介绍

        基本语法:

std::function<return_type(parameter_types)> var_name;

        其中,return_type是函数返回值类型,parameter_types是函数参数类型。

        举个例子:

int func(int x, int y) { return x + y; }
std::function<int(int, int)> f = func;

class A {
public:
    int mem_func(int x) { return x * x; }
};
std::function<int(A*, int)> f2 = &A::mem_func;

        std::function对象可以像普通函数一样调用,并且可以使用bool类型的运算符来检查调用对象是否为空。

std::function<int(int, int)> f;
if (f)
    std::cout << f(1, 2) << std::endl;
else
    std::cout << "f is empty" << std::endl;

        具体使用例子:

#include <iostream>
#include <functional>

void test1(){std::cout<<"function"<<std::endl;}

int test2(int i){ return i; }

int test3(int i, int j){ return i+j; }

struct A{
    void foo(int i){ std::cout<<i<<std::endl; }
};

int main() {
    std::function<void()> fn1 = std::bind(test1);
    std::function<int(int)> fn2 = std::bind(test2, std::placeholders::_1);
    std::function<int(int, int)> fn3 = std::bind(test3, std::placeholders::_1, std::placeholders::_2);
    std::function<int(int)> fn4 = std::bind(test3, 3, std::placeholders::_1);
    std::function<int()> fn5 = std::bind(test3, 3, 4);

    A a;
    std::function<void(int)> fn6 = std::bind(&A::foo, &a, std::placeholders::_1);

    fn1();
    std::cout<<fn2(1)<<std::endl;
    std::cout<<fn3(2, 3)<<std::endl;
    std::cout<<fn4(3)<<std::endl;
    std::cout<<fn5()<<std::endl;
    fn6(8);
}

二、进阶使用方法

        内容来自github,我给大家贴在下面,做个分析。

2.1 与智能指针相结合

        std::function可以存储智能指针,避免内存泄漏:

std::function<int(int, int)> add = std::make_shared<int(*)(int, int)>([](int a, int b) { return a + b; });

        这段代码定义了一个变量add,它是一个std::function类型,这种类型可以存储一个可调用的函数(可以是函数指针、函数对象、lambda表达式等)。该函数的签名为int(int, int),即返回值类型为int,接受两个int类型参数。变量add被赋值为一个指向匿名函数的指针。这个匿名函数接受两个int类型参数,并返回它们的和。使用std::make_shared<int(*)(int, int)>来创建该函数的共享指针。

2.2 存储成员函数指针

        调用类的成员函数:

class A {
public:
    int add(int a, int b) { return a + b; }
};
std::function<int(A&, int, int)> add = &A::add;
A a;
std::cout << add(a, 3, 4) << std::endl;

        这段代码定义了一个类A,其中有一个名为add的成员函数,该函数接受两个int类型的参数并返回它们的和。然后定义了一个std::function变量add,该变量指向A类的add成员函数。接着创建了一个A类的对象a,最后使用std::cout输出add(a, 3, 4)的结果。

2.3 存储std::bind

std::function<int(int)> add3 = std::bind([](int a, int b) { return a + b; }, 3, std::placeholders::_1);
std::cout << add3(4) << std::endl;

        这段代码定义了一个std::function变量add3,该变量指向一个匿名函数,该函数接受一个int类型的参数并返回它与3的和。 使用std::bind将这个匿名函数绑定到了一个函数上,并且将参数3和占位符_1绑定在这个函数上。最后使用std::cout输出add3(4)的结果。

三、注意tips

        值得注意!!!std::function有一些限制,如不能存储重载函数等,详见C++标准库文档。

        

C++11标准库文档可以在以下网站中找到:

  • cppreference.com: std::function - cppreference.com
  • cplusplus.com: http://www.cplusplus.com/reference/functional/function/

C++17标准库文档可以在以下网站中找到:

  • cppreference.com: std::function - cppreference.com
  • cplusplus.com: http://www.cplusplus.com/reference/functional/function/

C++20标准库文档可以在以下网站中找到:

  • cppreference.com: std::function - cppreference.com
  • cplusplus.com: http://www.cplusplus.com/reference/functional/function/

             

相关文章:

  • 金华城乡建设部网站首页/长尾关键词搜索
  • 个人网站的设计论文/百度地图官网2022最新版下载
  • 临沂做网站的公司哪里有/项目推广平台有哪些
  • 工人找活平台/网站推广优化是什么意思
  • 网页设计尺寸分辨率/seo案例分享
  • wordpress 搜索栏目/电子技术培训机构
  • 一个阶段小结
  • vue(透传属性,$attrs)
  • 在linux安装nginx
  • 《Buildozer打包实战指南》第三节 安装Buildozer打包所需的依赖文件
  • Retrofit源码分析实践(二)【Retrofit 免费的api测试工具引入】
  • Cadence PCB仿真使用Allegro PCB SI仿真参数单位配置与说明图文教程
  • 《和声学教程》学习笔记(四):属七和弦及其转位
  • Kubernetes:如何实现跨集群节点均匀调度分布Pod(Pod拓扑分布约束)
  • 3DMAX砖墙神器WallBuilder:快速生成常见砖墙插件教程
  • 郭天祥十天入门单片机学习笔记
  • 计算机网络必会:面向连接,无连接,可靠与不可靠
  • vue实现购物车思想