C++如何声明类成员函数指针或类成员变量指针(A::*)

例如有如下类,

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)类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值