例如有如下类,
class A
{
int mem;
int* func(void)
{
//...
}
};
怎么声明类A的成员函数指针或成员变量指针呢?
int* (A::*func_ptr) (void) = &A::func;
int A::*obj_ptr = &A::mem;
上面声明了指向成员函数func的函数指针,和指向成员变量mem的变量指针,可以利用他们进行操作:
A a;
(a.*func_ptr)();
a.*obj_ptr = 1234;
这个用法在模板中用途很广,经常用来声明类型T中的成员函数指针或成员变量指针。
举个例子,C++11里有个类型判断的type_traits:
template < class T>
struct is_class;
用来判断T是否是class类型,它的实现就用到了A::*,如下:
namespace detail {
template <class T> char test(int T::*);
struct two { char c[2]; };
template <class T> two test(...);
}
template <class T>
struct is_class : std::integral_constant<bool, sizeof(detail::test<T>(0))==1 && !std::is_union<T>::value> {};
解释一下,定义了两个模板函数,一个形参是int T::*(指向int型类成员变量的指针),返回值是char(大小是1);另一个形参是所有类型,返回值是struct two(大小是2)。
is_class继承了std::integral_constant< T, T v >(内部定义了一个static const T类型变量value,取值为v),value的类型为bool,当detail::test(0)的大小为1时(只要T是class类型,就符合第一个模板函数test,则其返回值大小就为1,否则返回值大小为2),并且不为union类型时(加上这个是因为,union类型类似struct类型,也支持T::*),则为class(或struct)类型。