成员指针(pointer to member)是指可以指向类的非静态成员的指针。一般情况下,指针指向一个对象,但是成员指针指示的是类的成员,而非类的对象。类的静态成员不属于任何对象,因此无须特殊的指向静态成员的指针,指向静态成员的指针与普通指针没有什么区别。
成员指针的类型囊括了类的类型以及成员的类型。当初始化一个这样的指针时,我们令其指向类的某个成员,但是不指定该成员所属的对象;直到使用成员指针时,才提供成员所属的对象。
要想通过一个指向成员函数的指针进行函数调用,必须首先利用.* 运算符或->*运算符将该指针绑定到特定的对象上。因此与普通的函数指针不同,成员指针不是一个可调用对象,这样的指针不支持函数调用运算符。
因为成员指针不是可调用对象,所以我们不能直接将一个指向成员函数的指针传递给算法。
当一个function对象包含有一个指向成员函数的指针时,function类知道它必须使用正确的指向成员的指针运算符来执行函数调用。
当我们定义一个function对象时,必须指定该对象所能表示的函数类型,即可调用对象的形式。如果可调用对象是一个成员函数,则第一个形参必须表示该成员是哪个(一般是隐式的)对象上执行的。同时,我们提供给function的形式中还必须指明对象是否是以指针或引用的形式传入的。
使用mem_fn生成一个可调用对象
mem_fn定义在functional头文件中,并且可以从成员指针生成一个可调用对象;和function不同的是,mem_fn可以根据成员指针的类型推断可调用对象的类型,而无须用户显式地指定。