扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
类成员函数指针实践上是一个指针类型,不可直接通过调用运算符()作为可调用对象调用,一般调用该类成员函数指针需要指定该指针对应的对象。
创新互联专注于江宁网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供江宁营销型网站建设,江宁网站制作、江宁网页设计、江宁网站官网定制、小程序开发服务,打造江宁网络公司原创品牌,更为您提供江宁网站排名全网营销落地服务。一般情况下调用类成员函数指针:
// a.h #ifndef A_H #define A_H #includeusing std::cout; using std::endl; class A{ public: void print(); }; #endif // a.cpp #include "a.h" void A::print() { cout << "A::print" << endl; } // main.cpp #include "a.h" using pClassF = void (A::*)(); // 声明类A的成员函数指针类型 int main() { pClassF pf= &A::print; // 定义类成员函数指针,不支持函数到指针的自动转换 A a; (a.*pf)(); // .*、->*成员访问符,因为访问优先级则(a.*pf)的括号必须添加 return 0; }
其中A::*表示是类A的成员指针,接着的()表示是无参的函数类型;
如果直接是pf()则出错,因为pf不是可调用对象其未指定对象执行;
使用
因为类的成员函数执行时,会在参数列表添加参数--隐式的this实参,在function模板类调用时可以传入对象实现this的功能(传入的对象不一定是指针类型),function
// main.cpp ,头文件a.h与源文件a.cpp之前相同 #include#include "a.h" using std::function; using pClassF = void (A::*)(); // 声明类A的成员函数指针类型 int main() { auto pf= &A::print; // 定义类成员函数指针,不支持函数到指针的自动转换 A a; // void 表示成员函数的返回值,A表示传入的参数类型为A,因为是模板类型则要求可以准确匹配,且A类型可以调用对应的成员函数,如果是const A类要调用const成员函数 function fnt = pf; fnt(a); return 0; }
通过fnt(a)传入对象a,在function
使用std::mem_fn标准库函数
mem_fn函数可以通过成员函数指针的类型自动推断可调用对象类型,用户无须指定。在可调用对象里有接收对象与对象指针的一组调用运算符重载函数,可使用对象或对象指针调用该成员函数,使用方式与function
// main.cpp,头文件a.h与源文件a.cpp之前相同 #include#include "a.h" using std::mem_fn; using pClassF = void (A::*)() const; // 声明类A的成员函数指针类型 int main() { auto pf= &A::print; // 定义类成员函数指针,不支持函数到指针的自动转换 A a; auto fnt = mem_fn(pf); // mem_fn通过成员函数指针自动推导可调用对象类型 fnt(a); // 使用对象调用成员函数 fnt(&a); // 使用对象指针调用成员函数 return 0; }
fnt(a)与fnt(&a)的结果一致。
使用通用的函数适配器bind生成可调用对象,需要命名空间std::placeholders表示在bind传给函数的参数:
与function
// main.cpp,头文件a.h与源文件a.cpp之前相同 #include#include "a.h" using namespace std::placeholders; // 用于表示bind传入指定函数的形参位置,即bind的_1、_2、...、_n等 using pClassF = void (A::*)() const; // 声明类A的成员函数指针类型 int main() { auto pf= &A::print; // 定义类成员函数指针,不支持函数到指针的自动转换 A a; auto fnt = bind(pf,_1); // _1表示在bind该位置的参数传给pf,并成为pf的第一个形参 fnt(a); // 使用对象调用成员函数 fnt(&a); // 使用对象指针调用成员函数 return 0; }
详细说明可查阅bind函数,fnt(a)与fnt(&a)的结果一致。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流