免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1590 | 回复: 2
打印 上一主题 下一主题

[C++] 关于C++两个语法的用法,求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-14 15:31 |只看该作者 |倒序浏览
template <typename T>
    struct ThreadParam
    {
        void (T::* _function)();
        T* _pobject;
        ThreadParam(void (T::* function)(), T * pobject)
        : _function(function), _pobject(pobject) { }
    };

template <typename T>
    static DWORD WINAPI WorkerThreadProc(LPVOID pvParam)
    {
        std::auto_ptr< ThreadParam<T> > p(static_cast< ThreadParam<T>* >(pvParam));
        try {
            (p->_pobject->*p->_function)();
        }
        catch(...) {}
        return 0;
    }

请大虾帮忙解释下T::* function 和->*东西为什么这么用

论坛徽章:
0
2 [报告]
发表于 2009-04-14 16:30 |只看该作者
顶上去

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2009-04-14 22:12 |只看该作者
void (T::* _function)();   T的成员函数指针。
T* _pobject;                   T的指针。
ThreadParam(void (T::* function)(), T * pobject)   ThreadParam的构造函数。
void (T::* function)(), 参数1,  T的成员函数指针。
T * pobject ,               参数2,  T的指针。

(p->_pobject->*p->_function)();

对 _pobject指向的对象, 调用_function指向的函数。


例子 :
class   Greeting {
  std::string name_;
public:
  explicit Greeting(const std::string& name) : name_(name) {}
  void Hello() const { std::cout<<"hello "<<name_<<"\n"; }
}

void f() {
   void ( C::* function)() = &C::hello;

   C c("Cherrie");
   (c.*function)(); // 对象使用 .* 运算符, 类似于 c.Hello(); 输出 Hello Cherrie

   C& rc = c;
   (rc.*function)(); // 引用使用 .* 运算符, 类似与 rc.Hello(); 输出同上。

   C* pc = new C("OwnWaterloo");
   (pc->*function)(); // 指针使用 ->* 运算符, 类似于 pc->Hello();  输出 Hello OwnWaterloo
}

void g() {

   std::auto_ptr<C> pc( new C("win32") );
   ThreadParam<C>* pparam = new ThreadParam<C>( &C::hello, pc.get() );
   pc.release(); //  要给ThreadParam添加析构行为, 以管理T*。 或者在WorkerThreadProc中 delete C*。

   HANLDE thread = reinterpret_cast<HANLDE>( _beginthreadex(...
       ,reinterpret_cast<unsigned (__stdcall*)(void*)>( reinterpret_cast<ptrdiff_t>(&WorkerThreadProc<C>) )
       ,pc, .... );
   CloseHandle(thread);
}

[ 本帖最后由 OwnWaterloo 于 2009-4-14 22:19 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP