{public:intAdd2(inta,intb)//更新函数,{returna +b; } };classCTest {public: typedef std::tr1::function<int(int,int)>PAdd;/*Attach函数来增加观察者的更新函数 由于std::function没有重载operator ==, 因此不能用std::find函数, 也不能在Remove中使用*ter == pAdd这样的比较。*/voidAttach(PAdd ...
因此,C++11推出了std::function与std::bind这两件大杀器,他们配合起来能够很好的替代函数指针。
在C语言中,我们也可以使用void指针来存储任意类型的数据。因此,我们也可以通过将std::function对象转换为void指针来传递它: void*data=&func;// 将函数对象转换为void指针std::function<int(int,int)>*ptr=(std::function<int(int,int)>*)data;// 将void指针转换为函数对象指针intresult=(*ptr)(1,2);//...
1template<typename TRet, typename TArg1, typename TArg2>2classmyfunction<TRet(TArg1, TArg2)>3{4public:5myfunction() : _fc(NULL) {}6~myfunction() {}78myfunction(TRet(*fc)(TArg1, TArg2))9: _fc(fc)10{11}1213public:14TRetoperator()(TArg1 arg1, TArg2 arg2)15{16if(_fc ==...
std::function 是可调用对象的包装器。它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。 下面看一个示例,如代码所示。 #include <iostream> // std::cout ...
在这个例子中,我们首先创建了一个std::function<void(int)>对象func,并将其绑定到函数myFunction。然后,我们使用func.target<void(*)(int)>()尝试提取函数指针。如果提取成功,我们通过该指针调用函数;否则,输出一条消息说明std::function没有持有函数指针。
std::function是一个可调用对象的包装器,一个类模板,可以容纳除了类成员(函数)指针之外的所用可调用对象,通过指它的模板参数,可以以统一的方式处理函数、函数对象、函数指针,并允许保存或者延迟执行。 使用方法: #include <iostream> #include <functional> ...
这篇博文中通过实现对String字符串大小写转换为列来说明C++中函数指针和std::function对象的使用。 我们在博文《C++实现一个简单的String类》中的自定义的String类为基础,再添加两个成员函数用于将字符串全部转为大写(toUpperCase)和全部转为小写(to...
而这也正是C++中std::function的目的所在。 单纯的函数指针并没有捕捉上下文的能力,这里的上下文就是指代码依赖的数据,你不得不自己动手构造出一个结构体用来存储代码依赖的上下文。 在C++中你没有办法单纯的利用函数指针指向对象的成员函数,就是因为函数指针没有办法捕捉this(指向对象的指针)这个上下文。
这可以使用一些模板元编程来实现。我最近在围绕OpenGL GLUT (依赖于回调函数指针)编写通用C++包装器时用...