﻿<?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++博客-Using c++</title><link>http://www.cppblog.com/myyi/</link><description>使用C++</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:06:42 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:06:42 GMT</pubDate><ttl>60</ttl><item><title>谈谈Lua的封装</title><link>http://www.cppblog.com/myyi/archive/2008/03/05/43776.html</link><dc:creator>long.muyi</dc:creator><author>long.muyi</author><pubDate>Wed, 05 Mar 2008 15:10:00 GMT</pubDate><guid>http://www.cppblog.com/myyi/archive/2008/03/05/43776.html</guid><wfw:comment>http://www.cppblog.com/myyi/comments/43776.html</wfw:comment><comments>http://www.cppblog.com/myyi/archive/2008/03/05/43776.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/myyi/comments/commentRss/43776.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/myyi/services/trackbacks/43776.html</trackback:ping><description><![CDATA[一个项目用到了Lua，开发人员对Lua库进行了一层封装，以利于使用。但从封装来看，如果对Lua库本身不了解的话，还是很难使用。我觉得好的封装应该是不用再详细理解原来的库/语言的情况下就能使用，这样的封装才有较大的价值。关于如何在C++中调用Lua函数，我做了自己的封装尝试，很不完整，但思路应该是对的。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">class&nbsp;RetTuple,&nbsp;class&nbsp;ArgTuple</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>struct&nbsp;lua_function<br>{<br>&nbsp;&nbsp;lua_function(lua_State&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;L,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;char&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;f)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;L_（L),&nbsp;f_(f)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;RetTuple&nbsp;operator()(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;ArgTuple&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;at)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;step&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(L_,&nbsp;f);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;step&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;这里需要一个模板函数，能将at中的所有数据<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;push到lua栈中，略掉<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><br>&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">step&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;lua_pcall(L_,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::tuples::length</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ArgTuple</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::value,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::tuples::length</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">RetTuple</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">::value,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;step&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;这里需要一个模板函数，能从lua栈中弹出所有<br>&nbsp;&nbsp;</span><span style="color: #000000;">//</span><span style="color: #000000;">&nbsp;的参数,&nbsp;然后返回，略掉<br>&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br>&nbsp;&nbsp;}<br>};</span></div>
举一个例子，使用的时候可以像下面这样调用：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">using&nbsp;namespace&nbsp;boost::tuples;<br><img src="http://www.cppblog.com/Images/dot.gif"><br><br>lua_State&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">　L&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;lua_open();<br>luaL_dostring(L,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">function&nbsp;foo(a)&nbsp;return&nbsp;a*2.0&nbsp;end</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br><img src="http://www.cppblog.com/Images/dot.gif"><br><br>lua_function</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tuple</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">,&nbsp;tuple</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;f(L,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">foo</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>tuple</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">,</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;ret&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;f(tuple</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(</span><span style="color: #000000;">3.5</span><span style="color: #000000;">));<br><br><img src="http://www.cppblog.com/Images/dot.gif"></span></div>
暂时没有时间对Lua库进行较完整的封装，以后有时间在做吧。<br><br>   <img src ="http://www.cppblog.com/myyi/aggbug/43776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/myyi/" target="_blank">long.muyi</a> 2008-03-05 23:10 <a href="http://www.cppblog.com/myyi/archive/2008/03/05/43776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解并实现单体模式(一) 引子</title><link>http://www.cppblog.com/myyi/archive/2008/03/02/43580.html</link><dc:creator>long.muyi</dc:creator><author>long.muyi</author><pubDate>Sun, 02 Mar 2008 15:01:00 GMT</pubDate><guid>http://www.cppblog.com/myyi/archive/2008/03/02/43580.html</guid><wfw:comment>http://www.cppblog.com/myyi/comments/43580.html</wfw:comment><comments>http://www.cppblog.com/myyi/archive/2008/03/02/43580.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/myyi/comments/commentRss/43580.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/myyi/services/trackbacks/43580.html</trackback:ping><description><![CDATA[单体模式：使一个程序里某个对象只能产生一个实例的模式。<br>它的定义如此简单，以至于看起来实现一个单体模式也是轻而易举的事。但如果读过GoF的《设计模式》和<font size="2">Andrei Alexandrescu</font><font size="3"><span style="font-size: 12pt;">的《Modern C++ Design》以后，大部分人可能都会改变原先过于单纯的想法。它太复杂了，以至于大部分程序员可能都无法给出一个较通用的实现。<br>实现一个单体模式挑战有（但不局限于）以下几个方面：<br>1.单体实例生成的时间<br>2.单体实例的生存期管理<br>3.单体实例的访问控制<br>4.单体实例的生成方式<br>以后的讨论会分析各个方面的挑战，糟糕的是，它们会互相纠缠在一起，并牵扯到其他相关的程序设计问题，很难只谈一个方面而不涉及其他，但尽量给出一个相对串行的脉络。<br><br><span style="color: red;">注</span>：
写这个系列文章的目的不是要和大家探讨如何实现一个大而全的单体模式，而是希望厘清其设计过程的问题，给希望挑战这个模式的程序员一些参考。我对这个模式
的观点是，尽量避免使用它，如果避免不了的话，尽量缩小这个模式的设计需求，并只用在你明确它的使用条件和可能带来的问题的环境下。</span></font> <img src ="http://www.cppblog.com/myyi/aggbug/43580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/myyi/" target="_blank">long.muyi</a> 2008-03-02 23:01 <a href="http://www.cppblog.com/myyi/archive/2008/03/02/43580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>