首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++函数指针std::function对象

C++函数指针std::function对象 这篇博文中通过实现对String字符串大小写转换为列来说明C++中函数指针std::function对象的使用。...下面我们分别使用函数指针的方式和C++ 11中的std::function对象进行实现。本文不对std::function的优点进行介绍,这是以一个简单示例进行入门介绍。...注意我们定义的transform函数指针的返回值是int,函数参数也是int,这是因为cctype头文件中的std::toupper和std::tolower函数的签名也是这样的。...WORLD) HELLO WORLD 析构函数(HELLO WORLD) 析构函数(Hello World) std::function对象 头文件 可以看到我们这里使用了std::function类型作为...std::toupper和std::tolower函数的返回值和参数类型int进行了强制转换,这样才可以跟定义的std::function类型的函数签名相符。

2.5K30

函数指针函数对象、lambda 表达式、std::function

函数指针 函数指针就是指向函数地址的指针 int Sum(int a, int b) { return a + b; } typedef int(*SumFunc)(int x, int y)...,一个 std::function 类型对象可以包装以下类型: 函数指针 类成员函数指针 (如使用 std::bind 传递) 函数对象(定义了 operator() 操作符的类对象) 既然能包装这些类型...std::function sum_func_1 = sum; std::cout << sum_func_1(1, 2) << std::endl;; // 包装函数对象...3(1, 2) << std::endl;; // 包装类成员函数指针 TestClass test_obj; using std::placeholders::_1; using std::placeholders...相互转换 4 中提到的都可以转换为 std::function 没有什么可以直接转换为 lambda 一个没有捕获变量的 lambda 函数, 可以显式转换成函数指针: // lambda without

68030
您找到你想要的搜索结果了吗?
是的
没有找到

函数指针函数对象、lambda 表达式、std::function

函数指针 函数指针就是指向函数地址的指针 int Sum(int a, int b) { return a + b; } typedef int(*SumFunc)(int x, int y)...,一个 std::function 类型对象可以包装以下类型: 函数指针 类成员函数指针 (如使用 std::bind 传递) 函数对象(定义了 operator() 操作符的类对象) 既然能包装这些类型...std::function sum_func_1 = sum; std::cout << sum_func_1(1, 2) << std::endl;; // 包装函数对象...3(1, 2) << std::endl;; // 包装类成员函数指针 TestClass test_obj; using std::placeholders::_1; using std::placeholders...相互转换 4 中提到的都可以转换为 std::function 没有什么可以直接转换为 lambda 一个没有捕获变量的 lambda 函数, 可以显式转换成函数指针: // lambda without

1K30

C++ 新特性学习(四) — Bind和Function

所以为了性能上考虑,建议传入的类型为引用指针,避免结构复制 另外,除了普通函数外,std::bind也支持成员函数,但是和普通函数不同,成员函数绑定的第二个参数必须是函数实例。...,所以也建议传入类引用指针,或者智能指针。...function f = int_div(); 但是成员变量和成员函数稍有不同,在申明时函数第一个类型必须是类的类型(指针),传入参数是也同样。...函数指针更小 函数指针更快(std::function 在析构时可能会释放函数对象) 函数指针对C语言库的向后兼容性更好 函数指针的错误信息更容易理解 性能 对象大小: 包含两个函数指针的大小...复制性能: 取决于所关联的函数函数对象,建议采用函数函数对象的引用传给std::function来提高复制性能 执行性能: 对一个正常的内联编译器而言,将会通过函数指针执行函数调用。

2.3K10

让类成员函数指针成为可调用对象

>的std::function模板类: 因为类的成员函数执行时,会在参数列表添加参数--隐式的this实参,在function模板类调用时可以传入对象实现this的功能(传入的对象不一定是指针类型...    function fnt = pf;     fnt(a);     return 0; } 通过fnt(a)传入对象a,在function里通过a与成员访问符调用成员函数...在可调用对象里有接收对象与对象指针的一组调用运算符重载函数,可使用对象对象指针调用该成员函数,使用方式与function相同: // main.cpp,头文件a.h与源文件a.cpp之前相同 #...使用通用的函数适配器bind生成可调用对象,需要命名空间std::placeholders表示在bind传给函数的参数: 与function类似,将隐式传入this形参转为显示传入对象;与mem_fn..." using namespace std::placeholders; // 用于表示bind传入指定函数的形参位置,即bind的_1、_2、...

1K40

C++:33---类成员指针

get = &Screen::get; 和其他函数指针类似,我们可以将指向成员函数指针作为某个函数的返回类型形参类型。...Screen的一个符合要求的函数指针地址传入即可: using Action = char (Screen::*)(Screen::pos, Screen::pos)const;Screen& action...*运算符->*运算符来调用。因此与普通的函数指针不同,成员指针不是一个可调用对象,这样的指针不支持函数调用运算符....,而非函数 ①使用function生成一个可调用对象 function模板: 从指向成员函数指针获取可调用对象的一种方法是使用function模板。...下面的代码就是正确的了: std::vector svec; //empty函数的返回值为bool,参数为const string&function<bool(const std

83530

std::functionstd::bind使用总结

C++中函数指针的用途非常广泛,例如回调函数,接口类的设计等,但函数指针始终不太灵活,它只能指向全局静态函数,对于类成员函数、lambda表达式其他可调用对象就无能为力了,因此,C++11推出了std...std::function vs 函数指针 C++函数指针相信大家用的很多了,用法最广泛的应该就是先定义函数指针的类型,然后在声明一个函数指针的变量作为另一个函数的入参,以此作为回调函数,如下列代码所示...std::function可以说是函数指针的超集,它除了可以指向全局和静态函数,还可以指向彷函数,lambda表达式,类成员函数,甚至函数签名不一致的函数,可以说几乎所有可以调用的对象都可以当做std:...::function填补了函数指针的灵活性,但会对调用性能有一定损耗,经测试发现,在调用次数达10亿次时,函数指针比直接调用要慢2秒左右,而std::function要比函数指针慢2秒左右,这么少的损耗如果是对于调用次数并不高的函数...正因为第一点,所以假如我们是在iOS程序中使用std::bind传入一个缺失参数,那么我们转化后的那个function会持有那些缺失参数,这里我们需要防止出现循环引用导致内存泄漏。

10.8K92

C++ 新特性学习(五) — 引用包装、元编程的类型属性和计算函数对象返回类型

、(成员)函数(指针) 构造时必须传入所引用的对象引用对象的右值引用 主要方法有 =号操作符, 用于重新绑定引用对象 类型转换操作符, 用于转换为模板目标类的引用类型 get方法, 用于获取引用的对象...,可以视为转换对象为引用 例程: // 和std::functionstd::bind函数配合使用 #include #include void assign...(int& l, int r) { l = r; } int main() { int a = 0, b = 10; std::function func =...0; } 注意:如果不用std::ref包装,即便函数申明需传入引用类型,但是由于绑定变量和函数的参数类型推断是分离的,会导致传值而不是引用 另外有些函数,如 std::ptr_fun, 通过函数指针构造函数对象...std::mem_fun, 通过成员函数指针构造函数对象 std::mem_fun_ref, 通过成员函数指针构造函数对象引用 不推荐使用,因为完全可以用std::bind代替,详细请参见 http:

1.2K30

C++ 新特性学习(五) — 引用包装、元编程的类型属性和计算函数对象返回类型

、(成员)函数(指针) 构造时必须传入所引用的对象引用对象的右值引用 主要方法有 =号操作符, 用于重新绑定引用对象 类型转换操作符, 用于转换为模板目标类的引用类型 get方法, 用于获取引用的对象...reference_wrapper,可以视为转换对象为引用 例程: // 和std::functionstd::bind函数配合使用 #include #include <functional...b); return 0; } 注意:如果不用std::ref包装,即便函数申明需传入引用类型,但是由于绑定变量和函数的参数类型推断是分离的,会导致传值而不是引用 另外有些函数,如 std:...:ptr_fun, 通过函数指针构造函数对象 std::mem_fun, 通过成员函数指针构造函数对象 std::mem_fun_ref, 通过成员函数指针构造函数对象引用 不推荐使用,因为完全可以用...这个修改可以在编译执行的时期。

1.8K30

【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识

,是每次函数调用时传入的变量;   (3)->后面跟着函数返回值的类型;   (4){ }里面可以编写逻辑函数,并使用[ ]和( )传入的参数   定义在lambda函数相同作用域的参数引用也可以被使用...,Lambda可以调用该类的private函数;当Lambda调用该类的成员函数时,操作成员变量或者其他成员函数时,需要将this传入,=和&会传入this。   ...使用std::function可以存储Lambda函数,比如可以用function来存储func0,用function来存储func1,带有参数的函数可以直接在()内输入参数类型...#include function f1 = func0; functionf2 = func1;   function还可以用于存放普通函数...functionf3 = bind(&ClassA::memberFunc2,obj,std::placeholders::_2);   使用bind函数绑定成员函数和对象指针

46830

C++11 Lambda 表达式

1.2 作用 以往C++需要传入一个函数的时候,必须事先进行声明,视情况可以声明为一个普通函数然后传入函数指针,或者声明一个仿函数(functor,函数对象),然后传入一个对象。...auto关键字实际会将 Lambda 表达式转换成一种类似于std::function的内部类型(但并不是std::function类型,虽然与std::function“兼容”)。...所以,我们也可以这么写: std::function Lambda = [] () -> int { return val * 100;}; 如果你对std::function这种写法感到很神奇,可以查看 C++ 11 的有关std::function的用法。...因此,严格来说,lambda函数并非函数指针,但是C++11允许lambda表达式向函数指针转换,前提是没有捕捉任何变量且函数指针所指向的函数必须跟lambda函数有相同的调用方式。

1.9K40

C++11 Lambda表达式

1.2作用 以往C++需要传入一个函数的时候,必须事先进行声明,视情况可以声明为一个普通函数然后传入函数指针,或者声明一个仿函数(functor,函数对象),然后传入一个对象。...auto关键字实际会将 Lambda 表达式转换成一种类似于std::function的内部类型(但并不是std::function类型,虽然与std::function“兼容”)。...所以,我们也可以这么写: std::function Lambda = [] () -> int { return val * 100;}; 如果你对std::function这种写法感到很神奇,可以查看 C++ 11 的有关std::function的用法。...因此,严格来说,lambda函数并非函数指针,但是C++11允许lambda表达式向函数指针转换,前提是没有捕捉任何变量且函数指针所指向的函数必须跟lambda函数有相同的调用方式。

1.2K31

std和boost的function与bind实现剖析

用过std和boost的function对象和bind函数的童鞋们都知道这玩意用起来腰不酸了,腿不疼了,心情也舒畅了。...先上一个简单得示例: std::string str; std::function func = std::bind(&std::string::at, &str); bool is_empty...如果bind操作传入的直接是一个仿函数,那么这个functor就直接是这个仿函数了;但是如果是普通函数或者成员函数,则会提供一个内定的仿函数内部记录这个函数指针。...使用过boost的bind和function的童鞋应该看到过它里面的一个注意事项,就是如果bind的函数参数是引用类型,应该在执行bind函数时使用引用包装(boost::ref或者std::ref)。...至于问题3中的区分成员函数和虚函数部分,可以参照我之前的一篇分享《VC和GCC成员函数指针实现的研究》。 至于function复制时如何发生?在有了functor结构之后就简单多了。

1.8K10

std和boost的function与bind实现剖析

用过std和boost的function对象和bind函数的童鞋们都知道这玩意用起来腰不酸了,腿不疼了,心情也舒畅了。...先上一个简单得示例: std::string str; std::function func = std::bind(&std::string::at, &str); bool is_empty...如果bind操作传入的直接是一个仿函数,那么这个functor就直接是这个仿函数了;但是如果是普通函数或者成员函数,则会提供一个内定的仿函数内部记录这个函数指针。...图9: function对象结构 首先是所有的function对象模板都集成自function_base,而这玩意里面主要有两部分。vtable指针和functor数据。...至于问题3中的区分成员函数和虚函数部分,可以参照我之前的一篇分享《VC和GCC成员函数指针实现的研究》。 至于function复制时如何发生?在有了functor结构之后就简单多了。

99230

日更系列:使用函数指针的小伎俩

一、什么是函数指针 函数指针是一种在C、C++、其他类 C 语言的指针。 C语言标准规定,函数指示符(function designator,即函数名字)既不是左值,也不是右值。...但C++语言标准规定函数指示符属于左值,因此函数指示符转换为函数指针的右值属于左值转换为右值。 二、函数指针应用 函数指针用于做接口的抽象。屏蔽函数实现过程。 最经典的例子就是比两个对象的大小。...答案是不可以 } } 显然不能这样写, 在这里需要解释一个问题是“成员指针”而不是普通的函数指针函数的成员指针不仅仅是函数指针。...静态成员函数不需要this,因此需要将该对象作为显式参数传入。 但是如果非要传入成员函数咋办,因为有时候成员函数会改变类的一些成员变量,不能静态化。..., Item& item) { return tc->IsTrancated(ctx, item); } 然后我们传入的除了has_truncated函数指针外,还需要传入std::unique_ptr

70360

C++11——lambda表达式

作用: 以往C++需要传入一个函数的时候,必须事先进行声明,视情况可以声明为一个普通函数然后传入函数指针,或者声明一个仿函数(functor,函数对象),然后传入一个对象。...} //按长度由短至长排列words std::sort(words.begin(),words.end(),shorter); lambda表达式可以像函数指针、仿函数一样,作为一个可调用对象(callable...也许有人会问,有了函数指针函数对象为何还要引入lambda呢?函数对象能维护状态,但语法开销大,而函数指针语法开销小,却没法保存函数体内的状态。如果你觉得鱼和熊掌不可兼得,那你可错了。...auto关键字实际会将 lambda 表达式转换成一种类似于std::function的内部类型(但并不是std::function类型,虽然与std::function“兼容”)。...所以,我们也可以这么写: std::function lambda = [] () -> int { return val * 100; }; 如果你对std::function<int(

1.3K21

CC++开发基础——函数指针&回调函数

函数指针的定义方式: return_type (*function_pointer_name)(list_of_parameter_types); 注意,函数指针名称外面一定要有圆括号,不然就成了定义一个返回值类型为...的函数fun 2.函数指针的初始化 方式一,使用nullptr函数名称来初始化函数指针。...3.函数指针调用函数 方式一,使用"(*function_pointer_name)"的方式调用,此方式向代码阅读者强调了使用的是函数指针。...... } function C{ auto* fun_ptr = &A; //函数指针初始化 auto res = B(*fun_ptr); //调用函数B,并将函数A的地址作为参数传入...回调函数在两个独立的类函数之间建立了一种通信渠道,可以通过给主函数传递不同的参数来随时让中间函数调用不同的底层函数

58520

c++ 深入理解数组

本文需要弄清楚的问题如下: 1,数组作为函数参数,传入的是值,还是地址? 2,数组作为函数参数,数组的长度能否确定? 解决如下 1,数组作为函数参数,传入的是地址。...2,数组作为函数参数,在用sizeof获取他的大小时,它已经是一个指针了。也就是说函数中没有办法知道传入进来的数组大小是多少。(数组仅在定义其的域范围内可确定大小。)...3.确定函数传入数组长度的方法 1 #include 2 using namespace std; 3 void testArray(char a[],int len)...返回数组的函数 数组不能被拷贝,所以函数不能返回数组,不过函数可以返回数组的指针或是引用 空一行留待以后补充 声明一个返回数组指针函数 Type (*function(parameter_list))...[demension] Type返回类型 parameter_list参数列表 demension数组的长度 (*function(parameter_list))两端的括号必须括上,没有括号返回的类型将是指针的数组

63260

Modern C++ 最核心的变化是什么?

也使得另外一些标准库(如 std::unique_ptr, std::function)成为可能。...右值引用至少可以解决以下场景中的移动语义缺失问题: 1.按值传入参数 按值传参是最符合人类思维的方式。基本的思路是,如果传入参数是为了将资源交给函数接受者,就应该按值传参。...如果你要在构造函数中接收 std::shared_ptr 并且存入类的成员(这是非常常见的),那么按值传入更是不二选择。...完全不用写析构函数的感觉,你造吗? unique_ptr 是非常轻量的封装,存储空间等价于裸指针,但安全性强了一个世纪。实际中需要共享所有权的对象(指针)是比较少的,但需要转移所有权是非常常见的情况。...二、完美转发 除了移动语义,右值引用还解决了 C++03 中引用语法无法转发右值的问题,实现了完美转发,才使得 std::function 能有一个优雅的实现。这部分不再展开了。

95721
领券