1. 首先,ns1是C++的名称空间修饰,就是一个限定作用,可先忽略
typedef void (nsc1::*ClickHandler)(nsc1*,gc2*);
2. 其次,typedef是给后面的类型一个别名,例如
typedef int MyInt; // 给int类型定义一个别名
typedef (*MyFunc)(int,int); // 定义一个函数指针的别名
void test(int,int){
}
MyFunc f = &test; // 这样函数指针就可以被赋值,test函数的参数和返回值类型与MyFunc匹配
3. C++有成员函数,成员函数也是一种函数,当然我们也可以对它用typedef定义其函数指针的别名,例如
class Test{
void echo(int){}
}
typedef (Test::*FnDump)(int); // 定义一个属于Test类的成员的函数指针,别名dumpMember
FnDump f = &Test::echo; // 于是类Test的成员函数echo,其指针可以被赋值给FnDump类型的实例。
但是怎么调用呢?echo是一个成员函数,隐藏了第一个指针this,需要这么调用
this->*f(10);
注意如果不加typedef,FnDump就会只是个变量:
(Test::*FnDump)(int); // FnDump是个成员函数指针变量
typedef (Test::*FnDump)(int); // FnDump是个成员函数指针的类型
4. 所以问题里的typedef,给类nsc1的成员函数定义了一个函数指针类型,类型别名是ClickHandler
nsc1里符合该函数指针参数类型和返回值类型的成员函数指针,都可以被赋值为ClickHandler的变量
下面的define遵守C/C++的宏定义规则,实际代码会被展开,看上去想解决的的是部分绑定的问题,但是做法不够现代,可以直接用这组现代的风格:
- [1] https://en.cppreference.com/w/cpp/language/pointer
- [2] https://en.cppreference.com/w/cpp/utility/functional/mem_fn
- [3] https://en.cppreference.com/w/cpp/utility/functional/bind