成员指针概述:
class Screen {
public:
typedef std::string::size_type pos;
char get_cursor()const { return contents[cursor]; }
char get()const;
char get(pos ht, pos wd)const;
private:
std::string contents;
pos cursor;
pos height, width;
};
const string Screen::*pdata;
//将pdata指向于Screen类的contents成员pdata = &Screen::contents;
auto pdata = &Screen::contents;
Screen myScreen;Screen *pScreen = &myScreen;
//.*解引用*pdata以获得myScreen对象的contents成员auto s = myScreen.*pdata; //相当于myScreen.contents
//->*解引用*pdata以获得myScreen对象的contents成员s = pScreen->*pdata; //相当于pScreen->contents
class Screen {public://成员函数,返回一个成员的指针static const std::string Screen::*data() {return &Screen::contents;}private:std::string contents;};
int main(){//调用data()静态函数来获得一个成员的指针const std::string Screen::*pdata = Screen::data();return 0;}
int main(){Screen *pScreen = new Screen;
const std::string Screen::*pdata = Screen::data();auto s = pScreen->*pdata; //等价于pScreen->contents
return 0;}
//pmf是一个函数指针,指向于get_cursor函数auto pmf = &Screen::get_cursor;
class Screen {public:typedef std::string::size_type pos;
char get_cursor()const { return contents[cursor]; }char get()const;char get(pos ht, pos wd)const;//...};
int main(){//pmf2是一个成员函数指针,其指向于返回值为char,形参为两个Screen::pos类型的成员函数char (Screen::*pmf2)(Screen::pos, Screen::pos)const;//为pmf2指针赋值pmf2 = &Screen::get;return 0;}
//错误的语法,非成员函数p不能使用const限定符char Screen::*pmf2(Screen::pos, Screen::pos)const;
char (Screen::*pmf2)(Screen::pos, Screen::pos)const;
pmf2 = &Screen::get; //正确pmf2 = Screen::get; //错误,缺少&。在成员函数和指针之间不存在自动转换规则
//pmf为成员函数指针,指向于get_cursor()函数auto pmf = &Screen::get_cursor;//pmf2为成员函数指针,指向于带有两个参数的get()函数char (Screen::*pmf2)(Screen::pos, Screen::pos)const = &Screen::get;
Screen myScreen;Screen *pScreen = &myScreen;
char c1 = (myScreen.*pmf)(); //等价于myScreen.get_cursor()char c2 = (pScreen->*pmf2)(0, 0);//等价于pScreen->get(0,0)
char c1 = myScreen.*pmf(); //错误的//其等价于myScreen.*(pmf())
char c2 = pScreen->*pmf2(0, 0); //错误的//其等价于myScreen->*(pmf2(0,0))
//Action是一种可以指向Screen成员函数的指针,其接受两个pos实参,返回值类型为charusing Action = char (Screen::*)(Screen::pos, Screen::pos)const;
//get是一个指向成员函数的指针Action get = &Screen::get;
using Action = char (Screen::*)(Screen::pos, Screen::pos)const;
//action是一个函数,其中参数2为一个指针,并且其有默认实参,指向于Screen的get成员函数Screen& action(Screen&, Action = &Screen::get);
using Action = char (Screen::*)(Screen::pos, Screen::pos)const;Screen& action(Screen&, Action = &Screen::get);
int main(){Screen myScreen;Action get = &Screen::get;
action(myScreen); //使用默认实参action(myScreen, get); //参数2调用前面定义的指针变量getaction(myScreen, &Screen::get); //参数2显式地传入地址return 0;}
class Screen {public:typedef std::string::size_type pos;
//移动光标的一系列函数Screen& home();Screen& forward();Screen& back();Screen& up();Screen& down();private:pos cursor; //光标};
class Screen {public:typedef std::string::size_type pos;
Screen& home();Screen& forward();Screen& back();Screen& up();Screen& down();
//函数指针using Action = Screen& (Screen::*)();
//定义一个枚举enum Directions { HOME, FORWARD, BACK, UP, DOWN };//参数使用枚举来调用函数表中对应的函数Screen& move(Directions cm){//必须使用thisreturn (this->*Menu[cm])();}private:pos cursor;
static Action Menu[]; //函数表};
//初始化函数表,将内部移动光标的函数都添加进去Screen::Action Screen::Menu[] = {&Screen::home,&Screen::forward,&Screen::back,&Screen::up,&Screen::down };
int main(){Screen myScreen;myScreen.move(Screen::HOME); //调用muScreen.homemyScreen.move(Screen::DOWN); //调用muScreen.down
return 0;}
std::vector<std::string> svec;auto fp = &std::string::empty; //fp指向string的empty函数,fp是一个成员函数指针
//错误,必须使用.*或->*调用成员指针fpstd::find_if(svec.begin(), svec.end(), fp);
//检查对当前元素的断言是否为真if(fp(*it)) //错误,想要通过成员指针调用函数,必须使用->*运算符
std::vector<std::string> svec;
//empty函数的返回值为bool,参数为const string&function<bool(const std::string&)> fcn = &std::string::empty;
//现在是正确的了,fcn是一个可调用对象,使用.*调用emptystd::find_if(svec.begin(), svec.end(), fcn);
//假设it是find_if内部的迭代器,则*it是一个string对象if(fcn(*it)) //fcn就是empty的函数指针,等价于empty(*it)
if(((*it).*p)) //假设p是fcn内部的一个指向成员函数的指针,此案例中为指向于empty函数的指针
std::vector<std::string*> svec;
//empty函数的返回值为bool,参数为const string* function<bool(const std::string*)> fcn = &std::string::empty;
//现在是正确的了,fcn是一个可调用对象,使用->*调用emptystd::find_if(svec.begin(), svec.end(), fcn);
std::find_if(svec.begin(), svec.end(), mem_fn(&std::string::empty));
std::vector<std::string> svec;
auto f = mem_fn(&std::string::empty); //f接受一个string或者一个string*
f(*svec.begin()); //正确,传入一个string对象,f使用.*调用emptyf(&svec[0]); //正确,传入一个string的指针,f使用.*调用empty
std::vector<std::string> svec;
//选择范围中的每个string,并将其bind到empty的第一个隐式实参上auto it = find_if(svec.begin(), svec.end(), bind(&string::empty, _1));
std::vector<std::string> svec;
auto f = bind(&string::empty._1);f(*svec.begin()); //正确,传入一个string对象,f使用.*调用emptyf(&svec[0]); //正确,传入一个string的指针,f使用.*调用empty