﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-罗朝辉（飘飘白云）</title><link>http://www.cppblog.com/kesalin/</link><description>关注嵌入式操作系统，移动平台，图形开发。&lt;a href="http://weibo.com/kesalin/" target="_top"&gt;--&gt;加微博 ^_^&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 09 Mar 2026 03:01:54 GMT</lastBuildDate><pubDate>Mon, 09 Mar 2026 03:01:54 GMT</pubDate><ttl>60</ttl><item><title>Android多线程分析之五：使用AsyncTask异步下载图像</title><link>http://www.cppblog.com/kesalin/archive/2014/07/19/android_asynctask.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Sat, 19 Jul 2014 06:45:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2014/07/19/android_asynctask.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/207719.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2014/07/19/android_asynctask.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/207719.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/207719.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在本系列文章的第一篇《Android多线程分析之一：使用Thread异步下载图像》中，曾演示了如何使用 Thread 来完成异步任务。Android 为了简化在 UI 线程中完成异步任务（毕竟 UI 线程是 app 最重要的线程），实现了一个名为 AysncTask 的模板类。使用 AysncTask 能够在异步任务进行的同时，将任务进度状态反馈给 UI 线程（如让 UI 线程更新进度条）。正是由于它与 UI 线程紧密相关，使用的时候要就有一些限制，AysncTask 必须在 UI 线程中创建，并在 UI 线程中启动（通过调用其 execute() 方法）；此外，AysncTask 设计的目的是用于一些耗时较短的任务，如果是耗时较长的任务不推荐使用 AysncTask。<br><br>可以用简化记忆 “三参数，四步骤” 来学习 AysncTask。 即带有三个模板参数 <Params, Progress, Result>，四个处理步骤：onPreExecute，doInBackground，onProgressUpdate，onPostExecute。&nbsp;&nbsp;<a href='http://www.cppblog.com/kesalin/archive/2014/07/19/android_asynctask.html'>阅读全文</a><img src ="http://www.cppblog.com/kesalin/aggbug/207719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2014-07-19 14:45 <a href="http://www.cppblog.com/kesalin/archive/2014/07/19/android_asynctask.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android多线程分析之四：MessageQueue的实现</title><link>http://www.cppblog.com/kesalin/archive/2014/07/14/android_messagequeue.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Mon, 14 Jul 2014 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2014/07/14/android_messagequeue.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/207645.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2014/07/14/android_messagequeue.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/207645.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/207645.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在前面两篇文章《Android多线程分析之二：Thread的实现》，《Android多线程分析之三：Handler，Looper的实现》中分别介绍了 Thread 的创建，运行，销毁的过程以及 Thread与 Handler，Looper 之间的关联：Thread 在其 run() 方法中创建和运行消息处理循环 Looper，而 Looper::loop() 方法不断地从 MessageQueue 中获取消息，并由 Handler 分发处理该消息。接下来就来介绍 MessageQueue 的运作机制，MessageQueue。&nbsp;&nbsp;<a href='http://www.cppblog.com/kesalin/archive/2014/07/14/android_messagequeue.html'>阅读全文</a><img src ="http://www.cppblog.com/kesalin/aggbug/207645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2014-07-14 17:15 <a href="http://www.cppblog.com/kesalin/archive/2014/07/14/android_messagequeue.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android多线程分析之三：Handler，Looper的实现</title><link>http://www.cppblog.com/kesalin/archive/2014/07/12/android_handler_looper.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Sat, 12 Jul 2014 03:00:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2014/07/12/android_handler_looper.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/207625.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2014/07/12/android_handler_looper.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/207625.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/207625.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在前文《Android多线程分析之二：Thread的实现》中已经详细分析了Android Thread 是如何创建，运行以及销毁的，其重点是对相应 native 方法进行分析，今天我将聚焦于 Android Framework 层多线程相关的类：Handler, Looper, MessageQueue, Message 以及它们与Thread 之间的关系。可以用一个不太妥当的比喻来形容它们之间的关联：如果把 Thread 比作生产车间，那么 Looper 就是放在这车间里的生产线，这条生产线源源不断地从 MessageQueue 中获取材料 Messsage，并分发处理 Message (由于Message 通常是完备的，所以 Looper 大多数情况下只是调度让 Message 的 Handler 去处理 Message)。正是因为消息需要在 Looper 中处理，而 Looper 又需运行在 Thread 中，所以不能随随便便在非 UI 线程中进行 UI 操作。 UI 操作通常会通过投递消息来实现，只有往正确的 Looper 投递消息才能得到处理，对于 UI 来说，这个 Loop&nbsp;&nbsp;<a href='http://www.cppblog.com/kesalin/archive/2014/07/12/android_handler_looper.html'>阅读全文</a><img src ="http://www.cppblog.com/kesalin/aggbug/207625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2014-07-12 11:00 <a href="http://www.cppblog.com/kesalin/archive/2014/07/12/android_handler_looper.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android多线程分析之二：Thread的实现</title><link>http://www.cppblog.com/kesalin/archive/2014/07/11/android_thread_impl.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Fri, 11 Jul 2014 02:29:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2014/07/11/android_thread_impl.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/207610.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2014/07/11/android_thread_impl.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/207610.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/207610.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在前文《Android多线程分析之一：使用Thread异步下载图像》中演示了如何使用 Thread 处理异步事务。示例中这个 Java Thread 类都是位于 Framework 层的类，它自身是通过 JNI 转调 dalvik 里面的 Thread 相关方法实现的。因此要分析 Androd 中的线程，就需要分析这两层中的与线程相关的代码，这就是本文要探讨的主题。本文将把 Framework 层中的 Java Thread 称为 Android 线程/Thread，而把 dalvik 中的  Thread 成为 dalvik 线程/Thread。 &nbsp;&nbsp;<a href='http://www.cppblog.com/kesalin/archive/2014/07/11/android_thread_impl.html'>阅读全文</a><img src ="http://www.cppblog.com/kesalin/aggbug/207610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2014-07-11 10:29 <a href="http://www.cppblog.com/kesalin/archive/2014/07/11/android_thread_impl.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>招聘：有兴趣做一个与Android对等的操作系统么？</title><link>http://www.cppblog.com/kesalin/archive/2014/07/10/hire.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Thu, 10 Jul 2014 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2014/07/10/hire.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/202754.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2014/07/10/hire.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/202754.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/202754.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前不久我发了一篇《八一八招聘的那些事儿》讲了我自己作为求职者对招聘的一些看法。那个时候我还在求职，对求职的结果还是挺满意的，五家公司面试，放弃了其中三家的offer（包括盛大云计算，东航信息部以及一小美资公司），拒了一家的二面（因为我已经做好决定了），最后选择了以前工作过的老东家-上海科泰。虽然科泰给的 offer 待遇不是所有 offer 中最高的，但我还是选择回归，主要是基于两点：对做的事情感兴趣能有担当，人好打交道团队氛围自由融洽（像我离开了又回来了）。<br><br>回来之后，就开始忙着招人的事情，可是招人的成功率远不像我求职时成功率那么高，大概只有20%的成功率。我想待招聘的事情告一段落之后，或许可以整理一篇《八一八求职的那些事儿》来讲讲从招聘方角度来看求职的一些想法。暂且列举一些目前碰到的常见求职问题：不了解招聘岗位要求，没有职业规划，工作多年却大部分时间在做维护（大公司病，局限于现有成熟框架内某个模块里的修修补补，而对框架以及其他模块却不甚了解），没有求知欲。或许是因为简历大都是从招聘网站上过来的&nbsp;&nbsp;<a href='http://www.cppblog.com/kesalin/archive/2014/07/10/hire.html'>阅读全文</a><img src ="http://www.cppblog.com/kesalin/aggbug/202754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2014-07-10 13:41 <a href="http://www.cppblog.com/kesalin/archive/2014/07/10/hire.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在遍历中使用 iterator/reverse_iterator 删除元素</title><link>http://www.cppblog.com/kesalin/archive/2014/07/10/cpp_stl.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Thu, 10 Jul 2014 01:42:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2014/07/10/cpp_stl.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/206672.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2014/07/10/cpp_stl.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/206672.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/206672.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 众所周知，在使用迭代器遍历 STL 容器时，需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形。下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时，正确更新迭代器的用法。本文完整源码：点此查看<br>首先，要明白使用正向迭代器（iterator）进行反向遍历是错误的用法，要不干嘛要有反向迭代器呢（reverse_iterator）。其次，根据容器的特性，遍历删除操作的用法可以分为两组，第一组是 list 和 vector，第二组是 map 和 set。&nbsp;&nbsp;<a href='http://www.cppblog.com/kesalin/archive/2014/07/10/cpp_stl.html'>阅读全文</a><img src ="http://www.cppblog.com/kesalin/aggbug/206672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2014-07-10 09:42 <a href="http://www.cppblog.com/kesalin/archive/2014/07/10/cpp_stl.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android多线程分析之一：使用Thread异步下载图像</title><link>http://www.cppblog.com/kesalin/archive/2014/07/10/android_thread_demo.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Thu, 10 Jul 2014 01:22:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2014/07/10/android_thread_demo.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/207598.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2014/07/10/android_thread_demo.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/207598.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/207598.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 打算整理一下对 Android Framework 中多线程相关知识的理解，主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Message, AysncTask，当然不可避免地要涉及到 native 方法，因此也会分析 dalvik 中和线程以及消息处理相关的代码：如 dalvik 中的 C++ Thread 类以及 MessageQueue 类。本文将从一个使用 Thread 的简单 应用入手，引入 Thread 这个话题，接下来的几篇文章会依次介绍前面提到的那些主题。&nbsp;&nbsp;<a href='http://www.cppblog.com/kesalin/archive/2014/07/10/android_thread_demo.html'>阅读全文</a><img src ="http://www.cppblog.com/kesalin/aggbug/207598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2014-07-10 09:22 <a href="http://www.cppblog.com/kesalin/archive/2014/07/10/android_thread_demo.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让gcc支持成员函数模板的trick</title><link>http://www.cppblog.com/kesalin/archive/2013/07/12/gcc_member_function_template.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Fri, 12 Jul 2013 14:04:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2013/07/12/gcc_member_function_template.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/201753.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2013/07/12/gcc_member_function_template.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/201753.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/201753.html</trackback:ping><description><![CDATA[<p data-mce-="" style="text-align: center; margin-top: 14px; margin-bottom: 14px; font-family: verdana, Arial, Helvetica, sans-serif;">让gcc支持成员函数模板的trick</p><p data-mce-="" style="text-align: center; margin-top: 14px; margin-bottom: 14px; font-family: verdana, Arial, Helvetica, sans-serif;">罗朝辉 (<a href="http://www.cppblog.com/kesalin/" target="_blank" data-mce-href="http://www.cnblogs.com/kesalin/">http://www.cppblog.com/kesalin/</a>)</p><div align="center" style="font-family: verdana, Arial, Helvetica, sans-serif;">本文遵循&#8220;<a href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/" target="_blank" data-mce-href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/">署名-非商业用途-保持一致</a>&#8221;创作公用协议</div><div align="center" data-mce-="" style="font-family: verdana, Arial, Helvetica, sans-serif;">&nbsp;</div><div align="center" data-mce-="" style="text-align: left; font-family: verdana, Arial, Helvetica, sans-serif;">gcc 4.7.3 不支持成员函数模板特化。如下代码：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />#ifndef&nbsp;__MEMFUNTEMPLATE_H__<br /><span style="color: #0000FF; ">#define</span>&nbsp;__MEMFUNTEMPLATE_H__<br /><br />#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Base&nbsp;{};<br /><span style="color: #0000FF; ">class</span>&nbsp;Derived&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Base&nbsp;{};<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;Functor&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;&lt;typename&nbsp;T&gt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;function()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;Primary&nbsp;template<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;template&lt;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;function&lt;<span style="color: #0000FF; ">int</span>&gt;(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;Specialization&nbsp;for&nbsp;int<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;template&lt;&gt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;function&lt;Base&nbsp;*&gt;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;Specialization&nbsp;for&nbsp;Base&nbsp;*<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Tester&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;DoTest()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Functor&nbsp;functor;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;functor.function&lt;<span style="color: #0000FF; ">char</span>&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;functor.function&lt;<span style="color: #0000FF; ">int</span>&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;functor.function&lt;Base&nbsp;*&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;functor.function&lt;Derived&nbsp;*&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><span style="color: #0000FF; ">#endif</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;__MEMFUNTEMPLATE_H__</span></div></div><div align="center" data-mce-=""><p style="font-family: verdana, Arial, Helvetica, sans-serif; text-align: left; margin-top: 14px; margin-bottom: 14px;">在 VS2010 中编译运行是没有问题的，但在 gcc 4.7.3下，编译都通不过：<br /></p><div style="font-family: verdana, Arial, Helvetica, sans-serif; background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><div style="text-align: left;">../src/MemFunTemplate.h:21:14:&nbsp;error:&nbsp;&lt;strong&gt;<span style="color: #0000ff;">explicit</span>&nbsp;specialization&nbsp;<span style="color: #0000ff;">in</span>&nbsp;non-<span style="color: #0000ff;">namespace</span>&nbsp;scope&lt;/strong&gt;&nbsp;&#8216;<span style="color: #0000ff;">struct</span>&nbsp;Functor&#8217;</div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><div style="text-align: left;">../src/MemFunTemplate.h:22:24:&nbsp;error:&nbsp;template-id&nbsp;&#8216;function&lt;<span style="color: #0000ff;">int</span>&gt;&#8217;&nbsp;<span style="color: #0000ff;">in</span>&nbsp;declaration&nbsp;of&nbsp;primary&nbsp;template</div><div style="text-align: left;">../src/MemFunTemplate.h:26:14:&nbsp;error:&nbsp;<span style="color: #0000ff;">explicit</span>&nbsp;specialization&nbsp;<span style="color: #0000ff;">in</span>&nbsp;non-<span style="color: #0000ff;">namespace</span>&nbsp;scope&nbsp;&#8216;<span style="color: #0000ff;">struct</span>&nbsp;Functor&#8217;</div><div style="text-align: left;">../src/MemFunTemplate.h:26:38:&nbsp;error:&nbsp;template-id&nbsp;&#8216;function&lt;Base*&gt;&#8217;&nbsp;<span style="color: #0000ff;">in</span>&nbsp;declaration&nbsp;of&nbsp;primary&nbsp;template</div><div style="text-align: left;">../src/MemFunTemplate.h:26:21:&nbsp;error:&nbsp;&#8216;<span style="color: #0000ff;">void</span>&nbsp;Functor::function()&#8217;&nbsp;cannot&nbsp;be&nbsp;overloaded</div><div style="text-align: left;">../src/MemFunTemplate.h:22:10:&nbsp;error:&nbsp;with&nbsp;&#8216;<span style="color: #0000ff;">void</span>&nbsp;Functor::function()&#8217;</div><div style="text-align: left;">../src/MemFunTemplate.cpp:&nbsp;In&nbsp;function&nbsp;&#8216;<span style="color: #0000ff;">int</span>&nbsp;main()&#8217;:</div><div style="text-align: left;">../src/MemFunTemplate.cpp:17:2:&nbsp;error:&nbsp;&#8216;DoTest&#8217;&nbsp;<span style="color: #0000ff;">is</span>&nbsp;not&nbsp;a&nbsp;member&nbsp;of&nbsp;&#8216;Functor&#8217;</div></div><p style="font-family: verdana, Arial, Helvetica, sans-serif; text-align: left; margin-top: 14px; margin-bottom: 14px;"><br />为了达到近似成员函数模板特化的效果，可以利用成员函数主模板以及重载函数来实现：<br /></p><div style="background-color: #eeeeee; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><div style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; text-align: left;"><span style="color: #008000;">/*</span></div><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #008000;"><div style="text-align: left;">&nbsp;*&nbsp;MemFunTemplate.h</div><div style="text-align: left;">&nbsp;*</div><div style="text-align: left;">&nbsp;*&nbsp;&nbsp;Created&nbsp;on:&nbsp;Jul&nbsp;12,&nbsp;2013</div><div style="text-align: left;">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Author:&nbsp;<span style="text-decoration: underline;">http://blog.csdn.net/kesalin/</span></div></span><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #008000;"><div style="text-align: left;">&nbsp;*/</div></span><div style="text-align: left;"><font face="verdana, Arial, Helvetica, sans-serif" size="2"><br /></font></div><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">#ifndef&nbsp;MEMFUNTEMPLATE_H_</div></font><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #0000ff;"><div style="text-align: left;">#define<font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;MEMFUNTEMPLATE_H_</font></div></span><div style="text-align: left;"></div><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">#include&nbsp;&lt;stdio.h&gt;</div></font><div style="text-align: left;"></div><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">template&lt;typename&nbsp;T&gt;</div></font><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #0000ff;"><div style="text-align: left;">struct<font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;DummyIdentity&nbsp;{</font></div></span><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; typedef&nbsp;T&nbsp;type;</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">};</div></font><div style="text-align: left;"></div><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #0000ff;"><div style="text-align: left;">class<font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;Base&nbsp;{};</font></div></span><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #0000ff;"><div style="text-align: left;">class<font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;Derived&nbsp;:&nbsp;</font>public<font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;Base&nbsp;{};</font></div></span><div style="text-align: left;"></div><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #0000ff;"><div style="text-align: left;">struct<font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;Functor&nbsp;{</font></div></span><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;"><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp; &nbsp; template&nbsp;&lt;typename&nbsp;T&gt;&nbsp;</font><span style="font-size: 13px; color: #0000ff;">void</span><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;function()&nbsp;{</font></div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; &nbsp; &nbsp; function(DummyIdentity&lt;T&gt;());</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; }</div></font><div style="text-align: left;"></div><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #0000ff;"><div style="text-align: left;">private<font face="verdana, Arial, Helvetica, sans-serif" size="2">:</font></div></span><div style="text-align: left;"></div><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; template&nbsp;&lt;typename&nbsp;T&gt;</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;"><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp; &nbsp;&nbsp;</font><span style="font-size: 13px; color: #0000ff;">void</span><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;function(DummyIdentity&lt;T&gt;)&nbsp;{</font></div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; &nbsp; &nbsp; printf("&nbsp;Primary&nbsp;template&nbsp;DummyIdentity&lt;T&gt;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.\n");</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; }</div></font><div style="text-align: left;"></div><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;"><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp; &nbsp;&nbsp;</font><span style="font-size: 13px; color: #0000ff;">void</span><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;function(DummyIdentity&lt;</font><span style="font-size: 13px; color: #0000ff;">int</span><font face="verdana, Arial, Helvetica, sans-serif" size="2">&gt;)&nbsp;{</font></div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; &nbsp; &nbsp; printf("&nbsp;overload&nbsp;function&nbsp;for&nbsp;DummyIdentity&lt;int&gt;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.\n");</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; }</div></font><div style="text-align: left;"></div><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;"><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp; &nbsp;&nbsp;</font><span style="font-size: 13px; color: #0000ff;">void</span><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;function(DummyIdentity&lt;Base&nbsp;*&gt;)&nbsp;{</font></div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; &nbsp; &nbsp; printf("&nbsp;overload&nbsp;function&nbsp;for&nbsp;DummyIdentity&lt;Base&nbsp;*&gt;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.\n");</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; }</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">};</div></font><div style="text-align: left;"></div><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #0000ff;"><div style="text-align: left;">class<font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;Tester&nbsp;{</font></div></span><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #0000ff;"><div style="text-align: left;">public<font face="verdana, Arial, Helvetica, sans-serif" size="2">:</font></div></span><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;"><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp; &nbsp;&nbsp;</font><span style="font-size: 13px; color: #0000ff;">static</span><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;</font><span style="font-size: 13px; color: #0000ff;">void</span><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;DoTest()</font></div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; {</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; &nbsp; &nbsp; Functor&nbsp;functor;</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;"><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp; &nbsp; &nbsp; &nbsp; functor.function&lt;</font><span style="font-size: 13px; color: #0000ff;">char</span><font face="verdana, Arial, Helvetica, sans-serif" size="2">&gt;();</font></div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;"><font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp; &nbsp; &nbsp; &nbsp; functor.function&lt;</font><span style="font-size: 13px; color: #0000ff;">int</span><font face="verdana, Arial, Helvetica, sans-serif" size="2">&gt;();</font></div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; &nbsp; &nbsp; functor.function&lt;Base&nbsp;*&gt;();</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; &nbsp; &nbsp; functor.function&lt;Derived&nbsp;*&gt;();</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">&nbsp; &nbsp; }</div></font><font face="verdana, Arial, Helvetica, sans-serif" size="2"><div style="text-align: left;">};</div></font><div style="text-align: left;"></div><span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #0000ff;"><div style="text-align: left;">#endif<font face="verdana, Arial, Helvetica, sans-serif" size="2">&nbsp;/*&nbsp;MEMFUNTEMPLATE_H_&nbsp;*/</font></div></span></div><p style="font-family: verdana, Arial, Helvetica, sans-serif; text-align: left; margin-top: 14px; margin-bottom: 14px;"><br />调用 DoTest() 运行结果如下：</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><div style="text-align: left;">&nbsp;Primary&nbsp;template&nbsp;DummyIdentity&lt;T&gt;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.</div><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><div style="text-align: left;">&nbsp;overload&nbsp;function&nbsp;<span style="color: #0000ff;">for</span>&nbsp;DummyIdentity&lt;<span style="color: #0000ff;">int</span>&gt;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.</div><div style="text-align: left;">&nbsp;overload&nbsp;function&nbsp;<span style="color: #0000ff;">for</span>&nbsp;DummyIdentity&lt;Base&nbsp;*&gt;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.</div><div style="text-align: left;">&nbsp;Primary&nbsp;template&nbsp;DummyIdentity&lt;T&gt;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.</div></div><p style="font-family: verdana, Arial, Helvetica, sans-serif; text-align: left; margin-top: 14px; margin-bottom: 14px;"><span data-mce-style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.5;" style="line-height: 1.5;"><br />注意：</span></p><p style="font-family: verdana, Arial, Helvetica, sans-serif; text-align: left; margin-top: 14px; margin-bottom: 14px;"><span data-mce-style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.5;" style="line-height: 1.5;">VS2010 版本的代码，模板形参为 T，在实例化不会进行隐式类型转换。即用&nbsp;</span>Derived * 当作实参调用的是主模板，而不是 Base * 特化版本</p><p style="font-family: verdana, Arial, Helvetica, sans-serif; text-align: left; margin-top: 14px; margin-bottom: 14px;">而在 gcc &nbsp;下，模板形参虽然也为T，但影响重载决议的 function 参数为：DummyIdentity&lt;T&gt;，用不同的实际参数实例化该模板，得到的是一堆重载函数。因此用&nbsp;Derived * 当作实参时，调用的函数自然就是实例化的&nbsp;void function(DummyIdentity&lt;T&gt;)了。</p></div><div align="center" data-mce-="" style="text-align: left; font-family: verdana, Arial, Helvetica, sans-serif;">&nbsp;</div><img src ="http://www.cppblog.com/kesalin/aggbug/201753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2013-07-12 22:04 <a href="http://www.cppblog.com/kesalin/archive/2013/07/12/gcc_member_function_template.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>八一八招聘的那些事儿</title><link>http://www.cppblog.com/kesalin/archive/2013/06/10/hunting.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Mon, 10 Jun 2013 14:39:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2013/06/10/hunting.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/200928.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2013/06/10/hunting.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/200928.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/200928.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近换了份工作，有一些求职的经历，再加上之前在公司做过一些招聘的事情，对于应聘与招聘有很多的感悟。趁着这感悟还尚未退温，在这职业的空挡期整理一下，记录下来。下面，我将从有工作经验的求职者的角度来八一八我对招聘的一些看法。&nbsp;&nbsp;<a href='http://www.cppblog.com/kesalin/archive/2013/06/10/hunting.html'>阅读全文</a><img src ="http://www.cppblog.com/kesalin/aggbug/200928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2013-06-10 22:39 <a href="http://www.cppblog.com/kesalin/archive/2013/06/10/hunting.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[深入浅出Cocoa]详解键值观察（KVO）及其实现机理</title><link>http://www.cppblog.com/kesalin/archive/2012/11/17/kvo.html</link><dc:creator>罗朝辉</dc:creator><author>罗朝辉</author><pubDate>Sat, 17 Nov 2012 09:41:00 GMT</pubDate><guid>http://www.cppblog.com/kesalin/archive/2012/11/17/kvo.html</guid><wfw:comment>http://www.cppblog.com/kesalin/comments/195304.html</wfw:comment><comments>http://www.cppblog.com/kesalin/archive/2012/11/17/kvo.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/kesalin/comments/commentRss/195304.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kesalin/services/trackbacks/195304.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: KVO 并不是什么新事物，换汤不换药，它只是观察者模式在 Objective C 中的一种运用，这是 KVO 的指导思想所在。其他语言实现中也有“KVO”，如 WPF 中的 binding。而在 Objective C 中又是通过强大的 runtime 来实现自动键值观察的。本文对 KVO 的使用以及注意事项，内部实现都详细介绍了一番，对 KVO 的理解又深入一层了。Objective 中的 KVO 虽然可以用，但却非完美，有兴趣的了解朋友请查看《KVO 的缺陷》 以及改良实现 MAKVONotificationCenter 。&nbsp;&nbsp;<a href='http://www.cppblog.com/kesalin/archive/2012/11/17/kvo.html'>阅读全文</a><img src ="http://www.cppblog.com/kesalin/aggbug/195304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kesalin/" target="_blank">罗朝辉</a> 2012-11-17 17:41 <a href="http://www.cppblog.com/kesalin/archive/2012/11/17/kvo.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>