C++:最强大的.NET语言之可访问性
作者 佚名技术
来源 程序设计
浏览
发布时间 2012-06-30
代码的机制,你可以存储一个函数指针,而在以后有需要的时候及时地调用,这通常用于把某算法与实现代码分开来,如在搜索中比较对象。另外,它也可在不同的线程中调用,以实现真实的异步编程。以下是一个ThreadPool类的简单示例,允许你排列一系列的函数指针,并在工作者线程中执行。
class ThreadPool { public: template <typename T> static void QueueUserWorkItem(void (T::*function)(), T* object) { typedef std::pair<void (T::*)(), T*> CallbackType; std::auto_ptr<CallbackType> p(new CallbackType(function, object)); if (::QueueUserWorkItem(ThreadProc<T>, p.get(), WT_EXECUTEDEFAULT)) { //ThreadProc负责删除pair. p.release(); } else { AtlThrowLastWin32(); } } private: template <typename T> static DWORD WINAPI ThreadProc(PVOID context) { typedef std::pair<void (T::*)(), T*> CallbackType; std::auto_ptr<CallbackType> p(static_cast<CallbackType*>(context)); (p->second->*p->first)(); return 0; } ThreadPool(); }; 在C++中使用线程池是简单兼自然的。 class Service { public: void AsyncRun() { ThreadPool::QueueUserWorkItem(Run, this); } void Run() { //其他代码 } } 很明显,ThreadPool类是非常受限的,它只能接受特定的函数指针,这只是示例本身而不是C++本身的局限性。 当C++程序员想要实现或得到用于异步编程的丰富库函数时,带着有此内置支持的CLR来了。"代理"与函数指针非常类似,除了针对的目标及方法属于的类型(其不能决定是否一个代理可以绑定于一个给定的方法);只要类型匹配,方法就能被代理,并在以后调用,与上面使用C++模板来实现允许接受任何类成员函数的例子比较,这在思想上是相似的。当然,代理还提供了更多且极其有用的间接函数调用的机制,以下是在C++/CLI中定义一个代理类型的示例: delegate void Function(); 使用代理也非常直截了当。 ref struct ReferenceType { void InstanceMethod() {} static void StaticMethod() {} }; //创建代理并绑定到成员函数的实例 Function^ f = gcnew Function(gcnew ReferenceType, ReferenceType::InstanceMethod); //也可绑定到静态成员函数,并结合几个代理形成代理链 f += gcnew Function(ReferenceType::StaticMethod); //调用函数 f(); 结束语 关于C++/CLI,真是说上几天也说不完,新的语言设计提供了空前的威力和绝无仅有的"优雅"语法,并且可在不牺牲简洁性、编程效率、执行效率的情况下,完全地使用C++来编写丰富的 .NET应用程序。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: C++ Builder初学问答目录下一篇: C++ Builder教程
关于C++:最强大的.NET语言之可访问性的所有评论