C++类成员能当做变量类型吗?
PHP中文网
PHP中文网 2017-04-17 13:22:27
0
3
627
  1. 弱逼问题:S::*xmeth是个啥? S是个类吧,xmeth是类的一个成员?成员能当做变量类型吗?

  2. 贴上相关代码

template<class S, class A1, class A2, class R> void
rpcs::reg(unsigned int proc, S*sob, int (S::*meth)(const A1 a1, const A2 a2, 
            R & r))
{
    class h1 : public handler {
        private:
            S * sob;
            int (S::*meth)(const A1 a1, const A2 a2, R & r);
        public:
            h1(S *xsob, int (S::*xmeth)(const A1 a1, const A2 a2, R & r))
                : sob(xsob), meth(xmeth) { }
            int fn(unmarshall &args, marshall &ret) {
                A1 a1;
                A2 a2;
                R r;
                args >> a1;
                args >> a2;
                if(!args.okdone())
                    return rpc_const::unmarshal_args_failure;
                int b = (sob->*meth)(a1, a2, r);
                ret << r;
                return b;
            }
    };
    reg1(proc, new h1(sob, meth));
}
  1. 贴上报错信息

  2. 贴上相关截图

  3. 已经尝试过哪些方法仍然没解决(附上相关链接)

PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(3)
Peter_Zhu

S::*xmeth是个啥?S是个类吧,xmeth 是类的一个成员?

根据模板的参数

template<class S, class A1, class A2, class R>

可知,SA1A2R都是类。所以,

S::*       // 表示指向类 S 的成员的指针
S::*xmeth  // 表示该指针的变量名是 xmeth

成员能当做变量类型吗?

不能,函数reg的第三个参数的类型是成员函数指针,不是成员。

具体来说,函数reg的第三个参数的变量名是meth,类型是int (S::*)(const A1, const A2, R &)。即meth是一个指向类S的成员函数的指针,这种类S的成员函数有三个参数,这三个参数的类型分别是const A1, const A2R &,这种类S的成员函数的返回值类型是int

用英语可能更容易理解:meth is a pointer points to member function of class S whose parameters are const A1, const A2 and R &, return type is int.

如果不太明白的话,可以先学习一下 函数指针的阅读方法,同时也可以使用 cdecl 这个网站。

巴扎黑
int (S::*meth)(const A1 a1, const A2 a2, R & r);
//这是你这个模板中的成员变量的声明
//变量名字是meth
//类型是 int (S::*)(const A1, const A2, R&), 也就是一个函数指针
//不过 比较特别的是一个 类的成员函数 指针,不是普通的全局函数指针
// 
大家讲道理

这是成员函数指针,一般来讲长度在4byte-16byte不等,内部根据不同的ABI约定,描述了成员函数在给定类指针的情况下的调用寻址方式,我看你类里面还有一个S*成员,这个类应该是类成员函数的一个包装吧

你那个代码里的调用方式是这样(sob->*meth)(参数)

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan