参考资料


• cplusplus.com:http://www.cplusplus.com/reference/functional/function/

• cppreference.com:http://en.cppreference.com/w/cpp/utility/functional/function

std::function简介


• 类模板声明

// MS C++ 2013
template<class _Fty> class function;
template<class _Fty> class function : public _Get_function_impl<_Fty>::type { ... }// GCC 4.8.2
template<typename _Signature>                  class function;
template<typename _Res, typename... _ArgTypes> class function<_Res(_ArgTypes...)>: public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, private _Function_base { ... }

// cplusplus.comtemplate <class T> function;     // undefined
template <class Ret, class... Args> class function<Ret(Args...)>;

• 类模板说明

std::function是一个函数包装器模板,最早来自boost库,对应其boost::function函数包装器。在c++0x11中,将boost::function纳入标准库中。该函数包装器模板能包装任何类型的可调用元素(callable element),例如普通函数和函数对象。包装器对象可以进行拷贝,并且包装器类型仅仅只依赖于其用特征(call signature),而不依赖于可调用元素自身的类型。

一个std::function类型对象实例可以包装下列这几种可调用元素类型:函数、函数指针、类成员函数指针或任意类型的函数对象(例如定义了operator()操作并拥有函数闭包)。std::function对象可被拷贝和转移,并且可以使用指定的调用特征来直接调用目标元素。当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常

• 模板参数说明

以cplusplus.com中描述的原型说明:

T      : 通用类型,但实际通用类型模板并没有被定义,只有当T的类型为形如Ret(Args...)的函数类型才能工作。

Ret   : 调用函数返回值的类型。

Args : 函数参数类型。

std::function详解


• 包装普通函数

#include <iostream>
#include <functional>
using namespace std;int g_Minus(int i, int j)
{return i - j;
}int main()
{function<int(int, int)> f = g_Minus;cout << f(1, 2) << endl;                                            // -1return 1;
}

• 包装模板函数

#include <iostream>
#include <functional>
using namespace std;template <class T>
T g_Minus(T i, T j)
{return i - j;
}int main()
{function<int(int, int)> f = g_Minus<int>;cout << f(1, 2) << endl;                                            // -1return 1;
}

• 包装lambda表达式

#include <iostream>
#include <functional>
using namespace std;auto g_Minus = [](int i, int j){ return i - j; };int main()
{function<int(int, int)> f = g_Minus;cout << f(1, 2) << endl;                                            // -1return 1;
}

• 包装函数对象

非模板类型:

#include <iostream>
#include <functional>
using namespace std;struct Minus
{int operator() (int i, int j){return i - j;}
};int main()
{function<int(int, int)> f = Minus();cout << f(1, 2) << endl;                                            // -1return 1;
}

模板类型:

#include <iostream>
#include <functional>
using namespace std;template <class T>
struct Minus
{ T operator() (T i, T j){return i - j;}
};int main()
{function<int(int, int)> f = Minus<int>();cout << f(1, 2) << endl;                                            // -1return 1;
}

• 包装类静态成员函数

非模板类型:

#include <iostream>
#include <functional>
using namespace std;class Math
{
public:static int Minus(int i, int j){return i - j;}
};int main()
{function<int(int, int)> f = &Math::Minus;cout << f(1, 2) << endl;                                            // -1return 1;
}

模板类型:

#include <iostream>
#include <functional>
using namespace std;class Math
{
public:template <class T>static T Minus(T i, T j){return i - j;}
};int main()
{function<int(int, int)> f = &Math::Minus<int>;cout << f(1, 2) << endl;                                            // -1return 1;
}

• 包装类对象成员函数

非模板类型:

#include <iostream>
#include <functional>
using namespace std;class Math
{
public:int Minus(int i, int j){return i - j;}
};int main()
{Math m;function<int(int, int)> f = bind(&Math::Minus, &m, placeholders::_1, placeholders::_2);cout << f(1, 2) << endl;                                            // -1return 1;
}

模板类型:

#include <iostream>
#include <functional>
using namespace std;class Math
{
public:template <class T>T Minus(T i, T j){return i - j;}
};int main()
{Math m;function<int(int, int)> f = bind(&Math::Minus<int>, &m, placeholders::_1, placeholders::_2);cout << f(1, 2) << endl;                                            // -1return 1;
}

转载于:https://www.cnblogs.com/heartchord/p/5017071.html

std::function相关推荐

  1. 函数指针amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  2. C++ std::function<void(int)> 和 std::function<void()> 作为函数参数的注意事项

    前言 std::function 作为标准库提供的函数指针,使用起来还是比较方便的,不过在使用过程中有一些需要注意的细节,这里做一个简单的记录. 基本使用 头文件: #include <func ...

  3. C++11中std::function的使用

    类模版std::function是一种通用.多态的函数封装.std::function的实例可以对任何可以调用的目标实体进行存储.复制.和调用操作,这些目标实体包括普通函数.Lambda表达式.函数指 ...

  4. std::function简介

    1. 简介 std::function是一个函数对象的包装器,std::function的实例可以存储,复制和调用任何可调用的目标,包括: 函数. lamada表达式. 绑定表达式或其他函数对象. 指 ...

  5. C++——包装器std::function与绑定器std::bind

    C++--包装器std::function与绑定器std::bind 1.可调用对象的包装器 std::function是可调用对象的包装器.它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可 ...

  6. C++11 std::bind std::function 高级用法

    C++11 std::bind std::function 高级用法 (c++11的新特性) 原文:https://blog.csdn.net/yangjie6898862/article/detai ...

  7. C++中std::function和std::bind

    1.可调用对象 可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型: 是一个具有operator()成员函数的类的对象: 可被转换成函数指针的类对象: 一个类成员函数指针: ...

  8. callable object与新增的function相关 C++11中万能的可调用类型声明std::function...

    在c++11中,一个callable object(可调用对象)可以是函数指针.lambda表达式.重载()的某类对象.bind包裹的某对象等等,有时需要统一管理一些这几类对象,新增的function ...

  9. C++ 11三个新特性的简单使用 - std::function、lambda 表达式、智能指针

    使用Dev C++:先设置Dev C++ 支持 C++ 11:见此文后部: https://blog.csdn.net/bcbobo21cn/article/details/111466179 1 s ...

  10. C++11 std::function

    @time 2019-07-07 @author Ruo_Xiao 1.头文件 #include <functional> 2.作用 类模版 std::function 是一种通用.多态的 ...

最新文章

  1. python中什么是字符举例说明_第20p,什么是字符串?Python中的str
  2. centos6.5 安装mysql8,centos6上安装mysql8.0版本
  3. 虚拟机网络设置方法——转载
  4. 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】
  5. python教程循环语句_Python教程:关于Python 循环语句
  6. ArcEngine开发之自定义工具
  7. 【推荐】 女人愁嫁时代终于来临
  8. python解释器的安装
  9. docker入门2---docker的初体验
  10. Sql Server数据库查询去重数据,并保留最新的数据,以及删除重复数据
  11. Quartus II13.1 simulate13.1 详细安装教学
  12. Qt自定义实现的日历控件
  13. 计算机win7如何连接wifi网络,win7台式电脑怎么连接wifi win7台式电脑如何设置wifi...
  14. Error: Unresolved node modules: vue
  15. 中国电信“公板”计划主攻中端市场
  16. Android Hal层回调APP应用接口
  17. 机遇与财富并存,一家网吧打造自己的客户数据库,后端疯狂盈利!
  18. 国画家刘艺青个人介绍
  19. 获取apk签名及apk签名方法
  20. 听说今天是七夕,那我们写一个网页开发来庆祝一下

热门文章

  1. 导出zabbix的IT service报表
  2. 学习笔记之七_第2层交换和生成树协议(STP)(CCNA知识考点)
  3. PHP设计模式——简单工厂
  4. 201671030116 宋菲菲 实验十四 团队项目评审课程学习总结
  5. 关于jquery获取单选框value属性值为on的问题
  6. 开发自己的博客转发插件(跨域)
  7. cocos2dx中node的pause函数(lua)
  8. 利用AjaxPro从客户端调用服务端函数的方法
  9. 问题总结(一)使用代码调整SharePoint WebPart 视图和列表菜单
  10. STM32 不小心被锁住,解开方法