﻿<?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/zhaoyg/</link><description>记录点滴，成就未来</description><language>zh-cn</language><lastBuildDate>Thu, 16 Apr 2026 11:49:33 GMT</lastBuildDate><pubDate>Thu, 16 Apr 2026 11:49:33 GMT</pubDate><ttl>60</ttl><item><title>关于风格的小记</title><link>http://www.cppblog.com/zhaoyg/archive/2013/02/10/197792.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 10 Feb 2013 06:33:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2013/02/10/197792.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/197792.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2013/02/10/197792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/197792.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/197792.html</trackback:ping><description><![CDATA[对于软件开发从一方面来讲，只要满足易扩展，易维护以及其他各种&#8220;易&#8221;就行，管他什么&#8220;风格&#8221;（这种风格可以是&#8220;思想&#8221;、&#8220;编码风格&#8221;、&#8220;技术&#8221;或其他什么的）。因为&#8220;风格&#8221;都是围绕着&#8220;易&#8221;字展开的。<br /><br />但是从另一方面来说，&#8220;风格&#8221;也很重要，它是一种文化。<br />就如同房子一样，虽然盖房子的目的就是为了住人，但在满足基本要求的前提下，不同地域的建筑风格却是各异的，而这种不同也映射着不同的灿烂文化。<br />文化重要性大家都清楚，所以从这一点来看，软件开发这种技术活（姑且说是技术活而非体力活）与&#8220;文化&#8221;的融合又显得十分的艺术性。<br /><br />或许重构干的就是将技术艺术化的活。<br /><br /><br />最后，新年寄语<br />祝家人和自己2013年心想事成，生活美满，身体健康，财源滚滚。<div> :)</div><img src ="http://www.cppblog.com/zhaoyg/aggbug/197792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2013-02-10 14:33 <a href="http://www.cppblog.com/zhaoyg/archive/2013/02/10/197792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于编写Excel脚本的一点收获</title><link>http://www.cppblog.com/zhaoyg/archive/2012/10/28/193980.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 28 Oct 2012 10:15:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2012/10/28/193980.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/193980.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2012/10/28/193980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/193980.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/193980.html</trackback:ping><description><![CDATA[为帮助他人统计excel中的数据，我用python写了一个读写excel文件的脚本。<br />虽然最终功能实现了但是速度却很慢，处理一个7列，4K行数据的excel文件用了3分钟左右的时间，后来了解到是我把接口用错了。<br /><br />脚本在读取excel文件时是以 行 为单位读取的，而我在实现读取整行时是一个单元格一个单元格的读取，然后将这些单元格在拼成一行，如下面代码：<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 />--><span style="color: #000000; ">ValidRowCount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;self.m_xlsSheet.UsedRange.Rows.Count<br />ValidColCount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;self.m_xlsSheet.UsedRange.Columns.Count<br />indexRow&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(indexRow&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;ValidRowCount):<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;indexCol&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;rowData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;indexCol&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;ValidColCount:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;self.m_xlsSheet.Cells(indexRow&nbsp;,&nbsp;indexCol).Value<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;val:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowData.append(val)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowData.append(</span><span style="color: #800000; ">''</span><span style="color: #000000; ">)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexCol&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;</span></div><br />后来了解到可以<span id="nsrTitle">通过<strong>Sheets</strong></span><span id="nsrTitle"><strong>.Range</strong></span> 一次性读取一个区域的数据，于是代码改成了：<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 />--><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(indexRow&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;ValidRowCount):<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;indexCol&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;rowData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;self.m_xlsSheet.Cells(indexRow&nbsp;,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;self.m_xlsSheet.Cells(indexRow&nbsp;,&nbsp;ValidColCount);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rowDatas&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;list(self.m_xlsSheet.Range(first&nbsp;,&nbsp;end).Value)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;indexCol&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span></div><br /><div>用修改后的再测了下，同样的文件只用了50秒左右，比原先的省了2/3的时间。<br />后来又增加了每次的读取亮，速度又快了不少。<br /> </div><img src ="http://www.cppblog.com/zhaoyg/aggbug/193980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2012-10-28 18:15 <a href="http://www.cppblog.com/zhaoyg/archive/2012/10/28/193980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于移动设备上各种app的一个缺陷</title><link>http://www.cppblog.com/zhaoyg/archive/2012/05/27/176379.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 27 May 2012 09:11:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2012/05/27/176379.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/176379.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2012/05/27/176379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/176379.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/176379.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">介于智能设备的特点，那些以登录方式赖以为生的app为了使用户登录便捷，通常都会默认自动记录用户密码，以便下次快速上线。</span><br /><br /><span style="font-size: 12pt;">这确实是一个很不错的特性</span><span style="font-size: 12pt;">，但</span><span style="font-size: 12pt;">却有一个问题，那就是智能移动设备弄丢或者被扒是常有的事，那么当</span><span style="font-size: 12pt;">&#8220;他人&#8221;使用该设备时，也就很容易登录这些程序，从而造成一些麻烦。</span><br /><br /><span style="font-size: 12pt;">我想，开发商是否应该实现另一种功能，让用户通过特定的方式强迫其他各种设备上的帐号下线，或者说强迫其重新输入密码</span><span style="font-size: 12pt;">。</span><br /><br /><span style="font-size: 12pt;">现在好像只有QQ可以这样做，其他的貌似还没见到。</span><img src ="http://www.cppblog.com/zhaoyg/aggbug/176379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2012-05-27 17:11 <a href="http://www.cppblog.com/zhaoyg/archive/2012/05/27/176379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的无知与C++的变态</title><link>http://www.cppblog.com/zhaoyg/archive/2012/05/03/173536.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Wed, 02 May 2012 16:12:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2012/05/03/173536.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/173536.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2012/05/03/173536.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/173536.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/173536.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">此刻我本已在床上睡觉了，但就在我睡前翻看《深度探索C++对象模型》时我看到了一段内容，也就是这段内容使得我写下了这篇笔记。</span><br /><br /><span style="font-size: 12pt;">这段内容大致讲的是关于模板中的命名决议：&#8220;scope of the template definition&#8221;与&#8220;scopy of the template instantition&#8221;</span><span style="font-size: 12pt;">。</span><br /><br /><span style="font-size: 12pt;">坦白的说我是第一次看到这一知识点，在上机验证后又回想《C++ Primer》 4th中可曾有提及过，后来发现4th中没有，倒是3rd中有专门的一小节专门陈述了下。<br /><br />后来我在《深度探索C++对象模型》书中关于模板中命名决议内容的旁边写下了这样一段话：<br /><br /><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天才发现还有这么个东西。我只能承认自己的无知与C++的变态，面对这一知识点。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2012.5.2 夜<br /><br /><br /><br /></em></span><img src ="http://www.cppblog.com/zhaoyg/aggbug/173536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2012-05-03 00:12 <a href="http://www.cppblog.com/zhaoyg/archive/2012/05/03/173536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>鼠标手势识别Demo</title><link>http://www.cppblog.com/zhaoyg/archive/2012/03/11/167677.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 11 Mar 2012 14:31:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2012/03/11/167677.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/167677.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2012/03/11/167677.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/167677.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/167677.html</trackback:ping><description><![CDATA[<span style="font-size: 18pt;"></span><span style="font-size: 12pt;">闲来无事，模仿着火狐的手势识别插件写了个迷你版。</span><br /><span style="font-size: 12pt;">说起来大约一年前在网上见过别人写这玩意，当时没怎么看其内容，只是感觉有难度的。然而直到近期自己分析这东西后发现其实没什么内容，于是自己就搞了个。</span><br /><br /><span style="font-size: 12pt;">效果截图：</span><br /><div align="left"><div align="center"><img alt="" src="http://www.cppblog.com/images/cppblog_com/zhaoyg/GestureDemo.png" height="530" width="575" /><br /><div align="left"><br /><span style="font-size: 12pt;">目前只是实现了基础部分，有空了在往上附加内容。</span><br /><span style="font-size: 12pt;">至于代码，其实这东西</span><span style="font-size: 12pt;">基本没什么含量，所以也就没必要附了。</span><span style="font-size: 12pt;"></span></div></div></div><img src ="http://www.cppblog.com/zhaoyg/aggbug/167677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2012-03-11 22:31 <a href="http://www.cppblog.com/zhaoyg/archive/2012/03/11/167677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】C++11中值得关注的几大变化</title><link>http://www.cppblog.com/zhaoyg/archive/2011/08/19/153882.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Fri, 19 Aug 2011 13:06:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2011/08/19/153882.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/153882.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2011/08/19/153882.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/153882.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/153882.html</trackback:ping><description><![CDATA[<div><div><div>     <p>赖勇浩（http://laiyonghao.com）<br /> 声明：本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的《The Biggest Changes in  C++11(and Why You Should Care)》一文，几乎所有内容都搬了过来，但不是全文照译，有困惑之处，请参详原文（<a href="http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/trackback/">http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/</a> ）。<br /> 注：作者 Danny Kalev 曾是 C++ 标准委员会成员。</p> <h2>Lambda 表达式</h2> <p>Lambda 表达式的形式是这样的：<br /> </p><div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>[capture](parameters)-&gt;return-type&nbsp;{body}&nbsp;&nbsp;</span></li></ol></div>  <br /> 来看个计数某个字符序列中有几个大写字母的例子：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>int&nbsp;main()&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;<span>char&nbsp;s[]="Hello&nbsp;World!";&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;<span>int&nbsp;Uppercase&nbsp;=&nbsp;0;&nbsp;//modified&nbsp;by&nbsp;the&nbsp;lambda&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;for_each(s,&nbsp;s+<span>sizeof(s),&nbsp;[&amp;Uppercase]&nbsp;(char&nbsp;c)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(isupper(c))&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uppercase++;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</li><li>&nbsp;cout&lt;&lt;&nbsp;Uppercase&lt;&lt;<span>"&nbsp;uppercase&nbsp;letters&nbsp;in:&nbsp;"&lt;&lt;&nbsp;s&lt;&lt;endl;&nbsp;&nbsp;</span></li><li>}&nbsp;&nbsp;</li></ol></div>  <br /> 其中 [&amp;Uppercase] 中的 &amp; 的意义是 lambda 函数体要获取一个 Uppercase 引用，以便能够改变它的值，如果没有 &amp;，那就 Uppercase 将以传值的形式传递过去。 <h2>自动类型推导和 decltype</h2> <p>在 C++03 中，声明对象的同时必须指明其类型，其实大多数情况下，声明对象的同时也会包括一个初始值，C++11 在这种情况下就能够让你声明对象时不再指定类型了：<br /> </p><div bg_c-sharp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>auto&nbsp;x=0;&nbsp;//0&nbsp;是&nbsp;int&nbsp;类型，所以&nbsp;x&nbsp;也是&nbsp;int&nbsp;类型&nbsp;&nbsp;</span></li><li>auto&nbsp;c=<span>'a';&nbsp;//char&nbsp;&nbsp;</span></li><li>auto&nbsp;d=0.5;&nbsp;<span>//double&nbsp;&nbsp;</span></li><li>auto&nbsp;national_debt=14400000000000LL;<span>//long&nbsp;long&nbsp;&nbsp;</span></li></ol></div>  <br /> 这个特性在对象的类型很大很长的时候很有用，如：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>void&nbsp;func(const&nbsp;vector&lt;int&gt;&nbsp;&amp;vi)&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;vector&lt;<span>int&gt;::const_iterator&nbsp;ci=vi.begin();&nbsp;&nbsp;</span></li><li>}&nbsp;&nbsp;</li></ol></div>  <br /> 那个迭代器可以声明为：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>auto&nbsp;ci=vi.begin();&nbsp;&nbsp;</span></li></ol></div>  <br /> C++11 也提供了从对象或表达式中&#8220;俘获&#8221;类型的机制，新的操作符 decltype 可以从一个表达式中&#8220;俘获&#8221;其结果的类型并&#8220;返回&#8221;：<br /> <div bg_c-sharp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>const&nbsp;vector&lt;int&gt;&nbsp;vi;&nbsp;&nbsp;</span></li><li>typedef&nbsp;decltype&nbsp;(vi.begin())&nbsp;CIT;&nbsp;&nbsp;</li><li>CIT&nbsp;another_const_iterator;&nbsp;&nbsp;</li></ol></div>  <h2>统一的初始化语法</h2> <p>C++ 最少有 4 种不同的初始化形式，如括号内初始化，见：<br /> </p><div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>std::string&nbsp;s("hello");&nbsp;&nbsp;</span></li><li><span>int&nbsp;m=int();&nbsp;//default&nbsp;initialization&nbsp;&nbsp;</span></li></ol></div>  <br /> 还有等号形式的：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>std::string&nbsp;s="hello";&nbsp;&nbsp;</span></li><li><span>int&nbsp;x=5;&nbsp;&nbsp;</span></li></ol></div>  <br /> 对于 POD 集合，又可以用大括号：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>int&nbsp;arr[4]={0,1,2,3};&nbsp;&nbsp;</span></li><li><span>struct&nbsp;tm&nbsp;today={0};&nbsp;&nbsp;</span></li></ol></div>  <br /> 最后还有构造函数的成员初始化：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>struct&nbsp;S&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;<span>int&nbsp;x;&nbsp;&nbsp;</span></li><li>&nbsp;S():&nbsp;x(0)&nbsp;{}&nbsp;};&nbsp;&nbsp;</li></ol></div>  <br /> 这么多初始化形式，不仅菜鸟会搞得很头大，高手也吃不消。更惨的是 C++03 中居然不能初始化 POD 数组的类成员，也不能在使用 new[] 的时候初始 POD 数组，操蛋啊！C++11 就用大括号一统天下了：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>class&nbsp;C&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li><span>int&nbsp;a;&nbsp;&nbsp;</span></li><li><span>int&nbsp;b;&nbsp;&nbsp;</span></li><li><span>public:&nbsp;&nbsp;</span></li><li>&nbsp;C(<span>int&nbsp;i,&nbsp;int&nbsp;j);&nbsp;&nbsp;</span></li><li>};&nbsp;&nbsp;</li><li>C&nbsp;c&nbsp;{0,0};&nbsp;<span>//C++11&nbsp;only.&nbsp;相当于&nbsp;C&nbsp;c(0,0);&nbsp;&nbsp;</span></li><li><span>int*&nbsp;a&nbsp;=&nbsp;new&nbsp;int[3]&nbsp;{&nbsp;1,&nbsp;2,&nbsp;0&nbsp;};&nbsp;/C++11&nbsp;only&nbsp;&nbsp;</span></li><li><span>class&nbsp;X&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;<span>int&nbsp;a[4];&nbsp;&nbsp;</span></li><li><span>public:&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;X()&nbsp;:&nbsp;a{1,2,3,4}&nbsp;{}&nbsp;<span>//C++11,&nbsp;初始化数组成员&nbsp;&nbsp;</span></li><li>};&nbsp;&nbsp;</li></ol></div>  <br /> 还有一大好事就是对于容器来说，终于可以摆脱 push_back() 调用了，C++11中可以直观地初始化容器了：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>//&nbsp;C++11&nbsp;container&nbsp;initializer&nbsp;&nbsp;</span></li><li>vector&nbsp;vs&lt;string&gt;={&nbsp;<span>"first",&nbsp;"second",&nbsp;"third"};&nbsp;&nbsp;</span></li><li>map&nbsp;singers&nbsp;=&nbsp;&nbsp;</li><li>&nbsp;&nbsp;{&nbsp;{<span>"Lady&nbsp;Gaga",&nbsp;"+1&nbsp;(212)&nbsp;555-7890"},&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{<span>"Beyonce&nbsp;Knowles",&nbsp;"+1&nbsp;(212)&nbsp;555-0987"}};&nbsp;&nbsp;</span></li></ol></div>  <br /> 而类中的数据成员初始化也得到了支持：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>class&nbsp;C&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;<span>int&nbsp;a=7;&nbsp;//C++11&nbsp;only&nbsp;&nbsp;</span></li><li><span>public:&nbsp;&nbsp;</span></li><li>&nbsp;C();&nbsp;&nbsp;</li><li>};&nbsp;&nbsp;</li></ol></div>  <h2>deleted 函数和 defaulted 函数</h2> <p>像以下形式的函数：<br /> </p><div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>struct&nbsp;A&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;A()=<span>default;&nbsp;//C++11&nbsp;&nbsp;</span></li><li>&nbsp;<span>virtual&nbsp;~A()=default;&nbsp;//C++11&nbsp;&nbsp;</span></li><li>};&nbsp;&nbsp;</li></ol></div>  <br /> 叫做 defaulted 函数，=default; 指示编译器生成该函数的默认实现。这有两个好处：一是让程序员轻松了，少敲键盘，二是有更好的性能。<br /> 与 defaulted 函数相对的就是 deleted 函数：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>int&nbsp;func()=delete;&nbsp;&nbsp;</span></li></ol></div>  <br /> 这货有一大用途就是实现 noncopyabe 防止对象拷贝，要想禁止拷贝，用 =deleted 声明一下两个关键的成员函数就可以了：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>struct&nbsp;NoCopy&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;NoCopy&nbsp;&amp;&nbsp;operator&nbsp;=(&nbsp;<span>const&nbsp;NoCopy&nbsp;&amp;&nbsp;)&nbsp;=&nbsp;delete;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;NoCopy&nbsp;(&nbsp;<span>const&nbsp;NoCopy&nbsp;&amp;&nbsp;)&nbsp;=&nbsp;delete;&nbsp;&nbsp;</span></li><li>};&nbsp;&nbsp;</li><li>NoCopy&nbsp;a;&nbsp;&nbsp;</li><li>NoCopy&nbsp;b(a);&nbsp;<span>//编译错误，拷贝构造函数是&nbsp;deleted&nbsp;函数&nbsp;&nbsp;</span></li></ol></div>  <h2>nullptr</h2> <p>nullptr 是一个新的 C++ 关键字，它是空指针常量，它是用来替代高风险的 NULL 宏和 0 字面量的。nullptr 是强类型的：<br /> </p><div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>void&nbsp;f(int);&nbsp;//#1&nbsp;&nbsp;</span></li><li><span>void&nbsp;f(char&nbsp;*);//#2&nbsp;&nbsp;</span></li><li><span>//C++03&nbsp;&nbsp;</span></li><li>f(0);&nbsp;<span>//调用的是哪个&nbsp;f?&nbsp;&nbsp;</span></li><li><span>//C++11&nbsp;&nbsp;</span></li><li>f(nullptr)&nbsp;<span>//毫无疑问，调用的是&nbsp;#2&nbsp;&nbsp;</span></li></ol></div>  <br /> 所有跟指针有关的地方都可以用 nullptr，包括函数指针和成员指针：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>const&nbsp;char&nbsp;*pc=str.c_str();&nbsp;//data&nbsp;pointers&nbsp;&nbsp;</span></li><li><span>if&nbsp;(pc!=nullptr)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;cout&lt;&lt;pc&lt;&lt;endl;&nbsp;&nbsp;</li><li><span>int&nbsp;(A::*pmf)()=nullptr;&nbsp;//指向成员函数的指针&nbsp;&nbsp;</span></li><li><span>void&nbsp;(*pmf)()=nullptr;&nbsp;//指向函数的指针&nbsp;&nbsp;</span></li></ol></div>  <h2>委托构造函数</h2> <p>C++11 中构造函数可以调用同一个类的另一个构造函数：<br /> </p><div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>class&nbsp;M&nbsp;//C++11&nbsp;delegating&nbsp;constructors&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;<span>int&nbsp;x,&nbsp;y;&nbsp;&nbsp;</span></li><li>&nbsp;<span>char&nbsp;*p;&nbsp;&nbsp;</span></li><li><span>public:&nbsp;&nbsp;</span></li><li>&nbsp;M(<span>int&nbsp;v)&nbsp;:&nbsp;x(v),&nbsp;y(0),&nbsp;&nbsp;p(new&nbsp;char&nbsp;[MAX])&nbsp;&nbsp;{}&nbsp;//#1&nbsp;target&nbsp;&nbsp;</span></li><li>&nbsp;M():&nbsp;M(0)&nbsp;{cout&lt;&lt;<span>"delegating&nbsp;ctor"&lt;&lt;end;}&nbsp;//#2&nbsp;delegating&nbsp;&nbsp;</span></li></ol></div>  <br /> #2 就是所谓的委托构造函数，调用了真正的构造函数 #1。 <h2>右值引用</h2> <p>在 C++03 中的引用类型是只绑定左值的，C++11 引用一个新的引用类型叫右值引用类型，它是绑定到右值的，如临时对象或字面量。<br /> 增加右值引用的主要原因是为了实现 move 语义。与传统的拷贝不同，move  的意思是目标对象&#8220;窃取&#8221;原对象的资源，并将源置于&#8220;空&#8221;状态。当拷贝一个对象时，其实代价昂贵且无必要，move 操作就可以替代它。如在  string 交换的时候，使用 move 意义就有巨大的性能提升，如原方案是这样的：<br /> </p><div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>void&nbsp;naiveswap(string&nbsp;&amp;a,&nbsp;string&nbsp;&amp;&nbsp;b)&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;string&nbsp;temp&nbsp;=&nbsp;a;&nbsp;&nbsp;</li><li>&nbsp;a=b;&nbsp;&nbsp;</li><li>&nbsp;b=temp;&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div>  <br /> 这种方案很傻很天真，很慢，因为需要申请内存，然后拷贝字符，而 move 就只需要交换两个数据成员，无须申请、释放内存和拷贝字符数组：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>void&nbsp;moveswapstr(string&amp;&nbsp;empty,&nbsp;string&nbsp;&amp;&nbsp;filled)&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li><span>//pseudo&nbsp;code,&nbsp;but&nbsp;you&nbsp;get&nbsp;the&nbsp;idea&nbsp;&nbsp;</span></li><li>&nbsp;<span>size_t&nbsp;sz=empty.size();&nbsp;&nbsp;</span></li><li>&nbsp;<span>const&nbsp;char&nbsp;*p=&nbsp;empty.data();&nbsp;&nbsp;</span></li><li><span>//move&nbsp;filled's&nbsp;resources&nbsp;to&nbsp;empty&nbsp;&nbsp;</span></li><li>&nbsp;empty.setsize(filled.size());&nbsp;&nbsp;</li><li>&nbsp;empty.setdata(filled.data());&nbsp;&nbsp;</li><li><span>//filled&nbsp;becomes&nbsp;empty&nbsp;&nbsp;</span></li><li>&nbsp;filled.setsize(sz);&nbsp;&nbsp;</li><li>&nbsp;filled.setdata(p);&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div>  <br /> 要实现支持 move 的类，需要声明 move 构造函数和 move 赋值操作符，如下：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>class&nbsp;Movable&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>Movable&nbsp;(Movable&amp;&amp;);&nbsp;<span>//move&nbsp;constructor&nbsp;&nbsp;</span></li><li>Movable&amp;&amp;&nbsp;operator=(Movable&amp;&amp;);&nbsp;<span>//move&nbsp;assignment&nbsp;operator&nbsp;&nbsp;</span></li><li>};&nbsp;&nbsp;</li></ol></div>  <br /> C++11 的标准库广泛使用 move 语义，很多算法和容器都已经使用 move 语义优化过了。 <h2>C++11 的标准库</h2> <p>除 TR1 包含的新容器（unordered_set, unordered_map, unordered_multiset,  和unordered_multimap），还有一些新的库，如正则表达式，tuple，函数对象封装器等。下面介绍一些 C++11 的标准库新特性：</p> <h3>线程库</h3> <p>从程序员的角度来看，C++11 最重要的特性就是并发了。C++11 提供了 thread 类，也提供了 promise 和 future  用以并发环境中的同步，用 async() 函数模板执行并发任务，和 thread_local  存储声明为特定线程独占的数据，这里（http://www.devx.com/SpecialReports/Article/38883）有一个简单 的 C++11 线程库教程（英文）。</p> <h3>新的智能指针类</h3> <p>C++98 定义的唯一的智能指针类 auto_ptr 已经被弃用，C++11 引入了新的智能针对类 shared_ptr 和 unique_ptr。它们都是标准库的其它组件兼容，可以安全地把智能指针存入标准容器，也可以安全地用标准算法&#8220;倒腾&#8221;它们。</p> <h3>新的算法</h3> <p>主要是 all_of()、any_of() 和 none_of()，下面是例子：<br /> </p><div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>#include&nbsp;&lt;algorithm&gt;&nbsp;&nbsp;</span></li><li><span>//C++11&nbsp;code&nbsp;&nbsp;</span></li><li><span>//are&nbsp;all&nbsp;of&nbsp;the&nbsp;elements&nbsp;positive?&nbsp;&nbsp;</span></li><li>all_of(first,&nbsp;first+n,&nbsp;ispositive());&nbsp;<span>//false&nbsp;&nbsp;</span></li><li><span>//is&nbsp;there&nbsp;at&nbsp;least&nbsp;one&nbsp;positive&nbsp;element?&nbsp;&nbsp;</span></li><li>any_of(first,&nbsp;first+n,&nbsp;ispositive());<span>//true&nbsp;&nbsp;</span></li><li><span>//&nbsp;are&nbsp;none&nbsp;of&nbsp;the&nbsp;elements&nbsp;positive?&nbsp;&nbsp;</span></li><li>none_of(first,&nbsp;first+n,&nbsp;ispositive());&nbsp;<span>//false&nbsp;&nbsp;</span></li></ol></div>  <br /> 还有一个新的 copy_n：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>#include&nbsp;&lt;algorithm&gt;&nbsp;&nbsp;</span></li><li><span>int&nbsp;source[5]={0,12,34,50,80};&nbsp;&nbsp;</span></li><li><span>int&nbsp;target[5];&nbsp;&nbsp;</span></li><li><span>//从&nbsp;source&nbsp;拷贝&nbsp;5&nbsp;个元素到&nbsp;target&nbsp;&nbsp;</span></li><li>copy_n(source,5,target);&nbsp;&nbsp;</li></ol></div>  <br /> iota() 算法可以用来创建递增序列，它先把初值赋值给 *first，然后用前置 ++ 操作符增长初值并赋值到给下一个迭代器指向的元素，如下：<br /> <div bg_cpp=""><div><div><a href="http://blog.csdn.net/lanphaday/article/details/6564162#" title="view plain">view plain</a></div></div><ol start="1"><li><span>#include&nbsp;&lt;numeric&gt;&nbsp;&nbsp;</span></li><li><span>int&nbsp;a[5]={0};&nbsp;&nbsp;</span></li><li><span>char&nbsp;c[3]={0};&nbsp;&nbsp;</span></li><li>iota(a,&nbsp;a+5,&nbsp;10);&nbsp;<span>//changes&nbsp;a&nbsp;to&nbsp;{10,11,12,13,14}&nbsp;&nbsp;</span></li><li>iota(c,&nbsp;c+3,&nbsp;<span>'a');&nbsp;//{'a','b','c'}&nbsp;&nbsp;</span></li></ol></div>  <br /> 是的，C++11 仍然缺少一些很有用的库如 XML API，socket，GUI、反射&#8212;&#8212;以及自动垃圾收集。然而现有特性已经让 C++  更安全、高效（是的，效率更高了，可以参见 Google 的  基准测试结果http://www.itproportal.com/2011/06/07/googles-rates-c-most- complex-highest-performing-language/）以及更加易于学习和使用。<br /> 如果觉得 C++ 变化太大了，不必惊恐，花点时间来学习就好了。可能在你融会贯通新特性以后，你会同意 Stroustrup 的观点：C++11 是一门新的语言&#8212;&#8212;一个更好的 C++。<p><br /></p> </div></div></div><img src ="http://www.cppblog.com/zhaoyg/aggbug/153882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-08-19 21:06 <a href="http://www.cppblog.com/zhaoyg/archive/2011/08/19/153882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中调用python函数</title><link>http://www.cppblog.com/zhaoyg/archive/2011/06/02/147938.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Thu, 02 Jun 2011 03:22:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2011/06/02/147938.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/147938.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2011/06/02/147938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/147938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/147938.html</trackback:ping><description><![CDATA[<br />以下是通过boost::python实现的，python版本2.7<br /><div>  <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Py_Initialize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pModule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">声明变量</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pFunc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;声明变量</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;pModule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">PyImport_ImportModule(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">helloworld</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span><span style="color: #008000; ">//</span><span style="color: #008000; ">这里是要调用的文件名</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">pModule)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">"</span><span style="color: #000000; ">err</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;*</span><span style="color: #000000; ">&nbsp;_module;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Module&nbsp;handle.</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;_module&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; ">(pModule);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过call_method</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;call_method</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(_module</span><span style="color: #000000; ">-&gt;</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">()&nbsp;,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;,&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">);&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过attr</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;main_module.attr("Hello")(2);&nbsp;展开如下</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;main_module(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">_module);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;FunObj&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;获取hello函数对象<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过object父类的operator()操作符</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;FunObj(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过call</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;call</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(FunObj.ptr(),&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;遍历一遍python内置类型list对象中的值</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;&nbsp;List&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;call_method</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">list</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(_module</span><span style="color: #000000; ">-&gt;</span><span style="color: #0000FF; ">get</span><span style="color: #000000; ">()&nbsp;,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">getList</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len(List);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;n&nbsp;;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;val&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;extract</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;(List[i]);&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;获取List[i]产生的object对象中的值</span><span style="color: #008000; ">，通过extract模板来转换<br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;val&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">"</span>&nbsp;<span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div> <br /> <br /> <br /> </div><img src ="http://www.cppblog.com/zhaoyg/aggbug/147938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-06-02 11:22 <a href="http://www.cppblog.com/zhaoyg/archive/2011/06/02/147938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过Boost::Python实现C++对象导入python环境</title><link>http://www.cppblog.com/zhaoyg/archive/2011/06/01/147885.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Wed, 01 Jun 2011 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2011/06/01/147885.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/147885.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2011/06/01/147885.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/147885.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/147885.html</trackback:ping><description><![CDATA[Google了很多资料，找到的都不满意，于是摸索许久后有了些发现。<br /><br />以下只是对自己摸索结果的总结，其中难免存在错误，<span style="color: #ff0000;"><strong>如有任何错误，望不惜指正</strong></span><span></span><br /><br />类定义：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Demo<br />{<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;m_val;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;m_nam;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setVal(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;val)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_val&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;val;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;getVal()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;m_val;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setName(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">name)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nam&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;getName()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;m_nam.c_str();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;show()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello&nbsp;world</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #000000;"><br />};</span></div><br /><strong>方法一：</strong><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fun1()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Py_Initialize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pModule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;PyImport_ImportModule(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">helloworld</span><span style="color: #000000; ">"</span><span style="color: #000000;">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; ">_module(pModule);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;main_module(_module);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;导出C++类到python中</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;class_&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000;">) </span><span style="color: #008000;">// 通过boost::python中的class_</span><span style="color: #008000;">将C++类包装成object类型，因为python中所有类型都是object</span><span style="color: #008000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setVal</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setVal)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setName</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span><span style="color: #008000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;通过boost::python提供的模板函数ptr，来将Demo对象传入python</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;Demo&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">(ptr(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">之前:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getName()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getVal()</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;call_method</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(pModule&nbsp;,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">之后:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getName()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getVal()</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br /><br /><div>&nbsp;&nbsp;&nbsp; <span style="color: #008000;">// 通过python函数返回C++对象</span><br />&nbsp;&nbsp; &nbsp;Demo tmp = call_method&lt;Demo&gt;(pModule , "ReturnCppClass");<br />&nbsp;&nbsp; &nbsp;std::cout &lt;&lt; tmp.getName() &lt;&lt; " " &lt;&lt; tmp.getVal() &lt;&lt;endl;</div>}</span></div><br />helloworld.py脚本内容：<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 />--><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;fun2():<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;test;<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp.setVal(</span><span style="color: #000000; ">12345</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp.setName(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">2011-5-19</span><span style="color: #800000; ">"</span><span style="color: #000000; ">);<br /><br /><div><span style="color: #0000ff;">def</span> ReturnCppClass():<br />&nbsp;&nbsp;&nbsp; tmp = Demo();<br />&nbsp;&nbsp;&nbsp; tmp.setName('<span style="color: #993300;">123456789</span>')<br />&nbsp;&nbsp;&nbsp; tmp.setVal(99);<br />&nbsp;&nbsp;&nbsp; return tmp;</div></span></div><br /><div><span style="color: #000000;">1.语句main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #0000FF; ">object</span><span style="color: #000000; ">(ptr(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000;">a)); 中的"test"是a对象在脚本中的别名，于是脚本中可以直接通过test名字操作C++对象。<br />2.Demo tmp = call_method&lt;Demo&gt;(pModule , "ReturnCppClass");来实现在python中创建C++对象，并且返回到C++中<br /><br /><strong>方法二：<br /></strong>通过智能指针实现C++对象的导入<strong><br /></strong></span></div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">typedef&nbsp;boost::shared_ptr&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;Demo&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;Demo_ptr;<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fun2()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Py_Initialize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Demo_ptr&nbsp;spD1(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Demo);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;spD1</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">NULL</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;spD1</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">setVal(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PyObject&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pModule&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;PyImport_ImportModule(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">helloworld</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register_ptr_to_python&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo_ptr</span><span style="color: #000000; ">&gt;</span><span style="color: #000000;">();&nbsp; </span><span style="color: #008000;">// 注册只能指针</span><span style="color: #000000;"><br /></span><span style="color: #008000; "></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;*</span><span style="color: #000000; ">&nbsp;_module;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_module&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;handle</span><span style="color: #000000; ">&lt;&gt;</span><span style="color: #000000; ">(pModule);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;main_module(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">_module);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">object</span><span style="color: #000000; ">&nbsp;dictionary&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">__dict__</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dictionary[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;class_&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setVal</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setVal)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setName</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br /></span><span style="color: #000000; "></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">DemoObj</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000;">&nbsp;spD1; </span><span style="color: #008000;">// 添加智能指针到脚本，并重命名</span><span style="color: #000000;"><br /></span><span style="color: #008000; "></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call_method</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(pModule&nbsp;,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SetObj</span><span style="color: #000000; ">"</span><span style="color: #000000;">); </span><span style="color: #008000;">// 在脚本中通过操纵智能指针来控制对象</span><span style="color: #000000;"><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getName()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a.getVal()</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(error_already_set)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PyErr_Print();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">spD1-&gt;getName():&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;spD1</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">getName()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">spD1-&gt;getVal():&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;spD1</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">getVal()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">std::endl;</span><span style="color: #000000; "><br />}</span></div><br />脚本内容：<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 />--><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;SetObj():<br />&nbsp;&nbsp;&nbsp;&nbsp;DemoObj.setVal(</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;DemoObj.setName(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">hello</span><span style="color: #800000; ">'</span><span style="color: #000000; ">);</span></div><br />1.register_ptr_to_python &lt;Demo_ptr&gt;(); 没有这句运行时会得到错误。关于register_ptr_to_python，boost中的解释是：<br /><em>&#8220;a function template   which registers a conversion for smart pointers to Python&#8221;</em><br /><br />2.<div><span style="color: #000000; ">dictionary[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;class_&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setVal</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setVal)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setName</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span></div>与方法一中的：<br /><div><span style="color: #000000; ">main_module.attr(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;class_&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Demo</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setVal</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setVal)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setName</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">Demo::setName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span><span style="color: #008000; "><br /></span></div>效果一样。<br /><br />-----------------------------------------------------------------------------------<br />以上就是关于如何将C++对象传入python的一点习得，<span style="color: #ff0000;"><strong>如有任何错误，望不惜指正</strong></span><br />-----------------------------------------------------------------------------------<br /><br />P.S.: cppblog提供的编辑器不好用<img src ="http://www.cppblog.com/zhaoyg/aggbug/147885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-06-01 17:34 <a href="http://www.cppblog.com/zhaoyg/archive/2011/06/01/147885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于C++嵌入python脚本后的程序发布问题</title><link>http://www.cppblog.com/zhaoyg/archive/2011/04/25/142659.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Mon, 25 Apr 2011 01:57:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2011/04/25/142659.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/142659.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2011/04/25/142659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/142659.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/142659.html</trackback:ping><description><![CDATA[近来在做一个C++嵌入python的程序，刚开始一直在本机跑，一切正常，后来拿到别人机子上就无法运行了。本以为是缺少了python27.dll，结果发现不止缺少这一个文件，貌似还缺少很多python的库文件。<br /><br />于是通过关键字&#8220;C++嵌入python 发布&#8221;，找到了一个用py2exe来解决问题，但我试了半天都没成功（也许是我自己没弄对的原因，因为人家都成功了）。<br />再后来我把关键字改为了&#8220;python C++ distribute embed&#8221;（即英文关键字），这下拨云见天了，因为在Google的第一页就有一个外国帖子其标题正和我意（果然英语给力）。<br /><br />看了那个贴子发现，之所以不能在没有安装python的机子上运行是因为：<br /><br />&#8220;<br /><strong>In addition to pythonxy.dll, you also need the entire Python library, i.e. the contents of the lib folder, plus the extension modules, i.e. the contents of the DLLs folder. Without the standard library, Python won't even start, since it tries to find os.py (in 3.x; string.py in 2.x). On startup, it imports a number of modules, in particular site.py.<br /></strong>&#8221;<br /><br />原文：<a href="http://stackoverflow.com/questions/1387906/c-with-python-embedding-crash-if-python-not-installed">http://stackoverflow.com/questions/1387906/c-with-python-embedding-crash-if-python-not-installed</a><br /><img src ="http://www.cppblog.com/zhaoyg/aggbug/142659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-04-25 09:57 <a href="http://www.cppblog.com/zhaoyg/archive/2011/04/25/142659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>U盘的起死回生记</title><link>http://www.cppblog.com/zhaoyg/archive/2011/02/27/140739.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 27 Feb 2011 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2011/02/27/140739.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/140739.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2011/02/27/140739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/140739.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/140739.html</trackback:ping><description><![CDATA[<p>前天往U盘里传了一些东西，结果在没有传完的情况下拔了U盘，等再用的时候发现插上u盘后虽然可以识别，但无法读取里面的内容，并且也无法格式化。<br><br>试了下网上的一些U盘修复工具，但均告失败。心想这下报废了，又得买了。<br><br>不过今天抱着侥幸心理又在网上搜了搜，发现有一种称为&#8220;量产工具&#8221;的我还没试，后来结果证明量产工具果然奏效，我的盘又活了<img border=0 src="http://www.cppblog.com/Emoticons/QQ/06.gif" width=20 height=20>。<br><br><br>以下为 教程 &amp; 工具<br><br>教程链接：<a href="http://bbs.deepin.org/viewthread.php?tid=1772579">http://bbs.deepin.org/viewthread.php?tid=1772579</a></p>
金士顿G3 4G 工具：<a href="http://www.cppblog.com/Files/zhaoyg/KinstonG3.rar">/Files/zhaoyg/KinstonG3.rar</a>
<img src ="http://www.cppblog.com/zhaoyg/aggbug/140739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-02-27 15:35 <a href="http://www.cppblog.com/zhaoyg/archive/2011/02/27/140739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>