打印

typedef 问题

[复制链接]
776|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txcy|  楼主 | 2013-8-31 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
struct NullCallback {};
18  
19  // 0 parameter version
20  
21  template<typename R>
22  class Callback<R ()>
23  {
24  public:
25      static const int Arity = 0;
26      typedef R ReturnType;
27  
28      Callback()                    : func(0), obj(0) {}
29      Callback(NullCallback)        : func(0), obj(0) {}
30      Callback(const Callback& rhs) : func(rhs.func), obj(rhs.obj) {}
31      ~Callback() {}
32  
33      Callback& operator=(NullCallback)
34          { obj = 0; func = 0; return *this; }
35      Callback& operator=(const Callback& rhs)
36          { obj = rhs.obj; func = rhs.func; return *this; }
37  
38      inline R operator()() const
39      {
40          return (*func)(obj);
41      }
42  
43  private:
44      typedef const void* Callback::*SafeBoolType;//这句话怎么理解啊??
45  public:
46      inline operator SafeBoolType() const
47          { return func != 0 ? &Callback::obj : 0; }
48      inline bool operator!() const
49          { return func == 0; }
50  
51  private:
52      typedef R (*FuncType)(const void*);
53      Callback(FuncType f, const void* o) : func(f), obj(o) {}
54  
55  private:
56      FuncType func;
57      const void* obj;
58  
59      template<typename FR>
60      friend class FreeCallbackFactory0;
61      template<typename FR, class FT>
62      friend class MemberCallbackFactory0;
63      template<typename FR, class FT>
64      friend class ConstMemberCallbackFactory0;
65  };

相关帖子

沙发
无冕之王| | 2013-8-31 09:32 | 只看该作者
ypedef const void* Callback::*SafeBoolType;//这句话怎么理解啊??

我认为是:

将const void *Callback::*定义为SafeBoolType,
也就是说:将CallBack中const void *的成员指针定义为了SafeBoolType类型;

如:CallBack中的const void* obj

使用特权

评论回复
板凳
yybj| | 2013-8-31 09:51 | 只看该作者
应该是不让外面获取这个成员函数指针的类型,这里是个private

使用特权

评论回复
地板
xsgy123| | 2013-8-31 09:55 | 只看该作者
那是类成员变量指针。
类型为const void*,类空间为Callback。定义后的类型名称为SafeBoolType

结果你这程序里,&Callback::obj的类型就是SafeBoolType;而下面的代码中(假如不考虑访问权限的问题):
{
  Callback o1;
}
o1.obj的类型则是const void*。举此例的目的是想让你注意区别:&Callback::obj是基于Callback类类型的导出,而o1.obj的类型是基于对象的导出。

另外如果有下面的代码:
{
  SafeBoolType p1;
  Callback o1;
}

p1 = &Callback::obj;
p1 = &o1.obj; //错误

o1.*p1 = 1;
相当于
o1.obj = 1;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

2106

帖子

0

粉丝