﻿<?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++博客-cpp小菜園</title><link>http://www.cppblog.com/0xfff/</link><description>簡單即是複雜</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:06:39 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:06:39 GMT</pubDate><ttl>60</ttl><item><title>fft淺析</title><link>http://www.cppblog.com/0xfff/archive/2012/11/04/194213.html</link><dc:creator>廷</dc:creator><author>廷</author><pubDate>Sat, 03 Nov 2012 16:10:00 GMT</pubDate><guid>http://www.cppblog.com/0xfff/archive/2012/11/04/194213.html</guid><wfw:comment>http://www.cppblog.com/0xfff/comments/194213.html</wfw:comment><comments>http://www.cppblog.com/0xfff/archive/2012/11/04/194213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/0xfff/comments/commentRss/194213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/0xfff/services/trackbacks/194213.html</trackback:ping><description><![CDATA[<br />一直都被fft吸引著，翻了下《信號與系統》，用純c++實現了一遍，算是把原理弄透了，然後想到了多項式擬合，翻書翻到了內積空間，還淺淺地了解一下小波分析，覺得用隨筆來把原理說透恐怕篇幅不夠，還是先弄個文檔什麽的吧<br />這裡先放幾張圖開個頭，有時間補全再說吧，顯示部份用了mgl<br /><img src="http://www.cppblog.com/images/cppblog_com/0xfff/square_signal_08.jpg" border="0" alt="" width="1034" height="611" /><br /><img src="http://www.cppblog.com/images/cppblog_com/0xfff/square_signal_16.jpg" border="0" alt="" width="1034" height="610" /><br /><img src="http://www.cppblog.com/images/cppblog_com/0xfff/square_signal_32.jpg" border="0" alt="" width="1034" height="609" /><br />主要就是驗證一下把方波拆分成不同頻率的信號<br /><br /><img src ="http://www.cppblog.com/0xfff/aggbug/194213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/0xfff/" target="_blank">廷</a> 2012-11-04 00:10 <a href="http://www.cppblog.com/0xfff/archive/2012/11/04/194213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++成员变量反射</title><link>http://www.cppblog.com/0xfff/archive/2012/04/25/172716.html</link><dc:creator>廷</dc:creator><author>廷</author><pubDate>Wed, 25 Apr 2012 05:18:00 GMT</pubDate><guid>http://www.cppblog.com/0xfff/archive/2012/04/25/172716.html</guid><wfw:comment>http://www.cppblog.com/0xfff/comments/172716.html</wfw:comment><comments>http://www.cppblog.com/0xfff/archive/2012/04/25/172716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/0xfff/comments/commentRss/172716.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/0xfff/services/trackbacks/172716.html</trackback:ping><description><![CDATA[<div><br style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 14px/21px verdana, 'courier new'; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" />　　最近（其实也有一段时间了），在c++项目中需要用到类似java的反射机制，时间也比较赶，只能周围看看有没有现成的库可用了，找到的资料也不算少，但多数都是关于动态创建类的，有点像工厂模式，而我需要的，是把实体类中的属性反射出来。最后，找到了一个叫LibReflection的东西，虽然后来还是没用上这个，但是稍微看了一下代码，还是有不少收获，所以就在这里记录下来了，当做学习，也当做对这个库的一个分析吧。<br style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 14px/21px verdana, 'courier new'; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" />　　LibReflection是属性和函数反射都有实现的，而整个库竟然就一个h文件，本人精力有限，只把属性反射抽取出来，相信离实际应用也有距离，如果有人路过看到，请体谅别拍砖了。<br style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 14px/21px verdana, 'courier new'; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" />　　那么，首先看一下使用：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; TestClass&nbsp;inst;<br />&nbsp;&nbsp;&nbsp;&nbsp;tat::tat_class&nbsp;*test_class&nbsp;=&nbsp;TestClass::get_class_ptr();<br />&nbsp;&nbsp;&nbsp;&nbsp;std::map&lt;std::<span style="color: #0000ff">string</span>,tat::tat_field&gt;&nbsp;field_map&nbsp;=&nbsp;test_class-&gt;get_fields();<br />&nbsp;&nbsp;&nbsp;&nbsp;tat::tat_field&nbsp;test_vec_field&nbsp;=&nbsp;field_map.find("_vec_f")-&gt;second;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;<span style="color: #0000ff">int</span>&gt;&nbsp;vec;<br />&nbsp;&nbsp;&nbsp;&nbsp;test_vec_field.<span style="color: #0000ff">get</span>(&amp;inst,vec);<br />&nbsp;&nbsp;&nbsp;&nbsp;vec.push_back(22);<br />&nbsp;&nbsp;&nbsp;&nbsp;test_vec_field.<span style="color: #0000ff">set</span>(&amp;inst,vec);<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&lt;&lt;inst._vec_f[0]&lt;&lt;std::endl;</div><br />　　TestClass类先不给出，反正就是该类有一个名字为&#8220;_vec_f&#8221;的属性，类型是std::vector&lt;int&gt;，然后这段代码通过反射修改_vec_f的内容。。至于tat_class和tat_field，相信熟悉java的人都能猜出是什么了。<br style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; font: 14px/21px verdana, 'courier new'; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" />　　获取及设置一个实例的成员变量的值不是难事，用一个宏就可以了：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">#define</span>&nbsp;_OFFSET_(_Obj_Ty,_Key)&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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;((unsigned&nbsp;<span style="color: #0000ff">long</span>)(&amp;((_Obj_Ty&nbsp;*)0)-&gt;_Key))</div><br />&nbsp;　　这个宏应该也不难理解，就是获取成员变量相对实例指针的偏移值。而关键问题是，如何通过变量名称就能查找出这个偏移呢？如何在变量初始化的时候就能记录下这个偏移呢？我们可以通过宏来声明变量，那么声明的时候就可以做一些事情了，但具体做些什么，还是没头绪。<br />　　这个问题自己思考了一段时间，无果。然后看了一下实现，深感自己的基础还没过关，其实说白了就是两个东西：构造函数、静态成员变量。<br />　　我们的目标是很明确的，要做到java的效果，结合上面那个宏，也不难想象出Class和Field类的样子（这里是tat_class和tat_field），tat_class无非就是保存了一个map，key是属性的名称，value是tat_field，至于tat_field就简单了，核心就是保存内存的偏移值，再提供操作值的接口就可以了。<br />　　先来看看tat_class：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000ff">class</span>&nbsp;tat_class<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::map&lt;std::<span style="color: #0000ff">string</span>,tat_field&gt;&nbsp;_field_map;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000ff">string</span>&nbsp;_key;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::map&lt;std::<span style="color: #0000ff">string</span>,tat_field&gt;&nbsp;get_fields()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>&nbsp;<span style="color: #0000ff">this</span>-&gt;_field_map;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tat_field&nbsp;get_field(std::<span style="color: #0000ff">string</span>&nbsp;key)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::map&lt;std::<span style="color: #0000ff">string</span>,tat_field&gt;::iterator&nbsp;itr&nbsp;=&nbsp;_field_map.find(key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>&nbsp;(*itr).second;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">void</span>&nbsp;add_field(<span style="color: #0000ff">const</span>&nbsp;tat_field&nbsp;&amp;field)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_field_map.insert(std::pair&lt;std::<span style="color: #0000ff">string</span>,tat_field&gt;(field.get_key(),field));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};</div><br />　　没有什么理解上的难点吧。<br />　　然后看看tat_field：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000ff">class</span>&nbsp;tat_field<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000ff">long</span>&nbsp;_offset;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000ff">string</span>&nbsp;_key;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tat_field(unsigned&nbsp;<span style="color: #0000ff">long</span>&nbsp;offset,std::<span style="color: #0000ff">string</span>&nbsp;key):_offset(offset),_key(key){}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tat_field(<span style="color: #0000ff">const</span>&nbsp;tat_field&nbsp;&amp;field)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">this</span>-&gt;_offset&nbsp;=&nbsp;field._offset;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">this</span>-&gt;_key&nbsp;=&nbsp;field._key;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Obj_Ty,typename&nbsp;_Value_Ty&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">void</span>&nbsp;<span style="color: #0000ff">get</span>(_Obj_Ty&nbsp;*obj,_Value_Ty&nbsp;&amp;value)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;*((_Value_Ty&nbsp;*)((unsigned&nbsp;<span style="color: #0000ff">char</span>&nbsp;*)obj&nbsp;+&nbsp;_offset));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Obj_Ty,typename&nbsp;_Value_Ty&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">void</span>&nbsp;<span style="color: #0000ff">set</span>(_Obj_Ty&nbsp;*obj,<span style="color: #0000ff">const</span>&nbsp;_Value_Ty&nbsp;&amp;value)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((_Value_Ty&nbsp;*)((unsigned&nbsp;<span style="color: #0000ff">char</span>&nbsp;*)obj&nbsp;+&nbsp;_offset))&nbsp;=&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000ff">string</span>&nbsp;get_key()&nbsp;<span style="color: #0000ff">const</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>&nbsp;<span style="color: #0000ff">this</span>-&gt;_key;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};</div><span style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; display: inline !important; font: 14px/21px verdana, 'courier new'; white-space: normal; orphans: 2; float: none; color: #000000; word-spacing: 0px"><br /></span>　　变量值的get和set函数使用了模板，这是为了使用的时候能作简单的类型推断。<br />　　然后就是重点了，如何在声明类的时候就把tat_class注入呢？如前面说的，静态成员变量：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">#define</span>&nbsp;CLASS_REGISTER(_Obj_Ty)&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;\<br /><span style="color: #0000ff">public</span>:&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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">static</span>&nbsp;tat::tat_class&nbsp;*&nbsp;get_class_ptr()&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;\<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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">static</span>&nbsp;tat::tat_class&nbsp;__class_##_Obj_Key##__;&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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>&nbsp;&amp;__class_##_Obj_Key##__;&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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />　　这个宏做了两件事：第一，声明静态函数get_class_ptr()，返回tat_class类型，第二，当然就是初始化tat_class了，因为同样是静态，所以不同的实例就共享了。<br />　　接下来是另一个重点，如何在声明成员变量的时候把tat_field注入到tat_class中，还是用宏解决：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px; border-image: initial"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">#define</span>&nbsp;FIELD_REGISTER(_Access,_Field_Ty,_Field_Key,_Obj_Ty)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />_Access:&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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;_Field_Ty&nbsp;_Field_Key;&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;\<br /><span style="color: #0000ff">private</span>:&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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">class</span>&nbsp;__field_register_##_Field_Key##__&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;\<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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>:&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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__field_register_##_Field_Key##__()&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;\<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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">static</span>&nbsp;tat::__field_register__&nbsp;reg_##_Field_Key(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Obj_Ty::get_class_ptr(),&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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_OFFSET_(_Obj_Ty,_Field_Key),&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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#_Field_Key);&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;\<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;\<br />&nbsp;&nbsp;&nbsp;&nbsp;}_Field_Key##_register;</div><br />　　分析这个宏，首先当然是声明变量了；然后就是一个神秘的类：__field_register_##_Field_Key##__<span style="color: #000000"></span><span style="color: #000000"></span>，这个类就只有一个构造函数，构造函数里面又是一个静态变量，类型是tat::__field_register__，可以想象得到，既然tat_class已经可以声明出来了，tat_field自然也没有难度，但声明是不足够的，还需要放到tat_class的map里面才算完成，在声明一个变量的时候，能做事的地方，我只能想到是构造函数了，所以就有了刚刚那个神秘的类，那个类的唯一作用就是其构造函数，而构造函数里面声明静态变量，则是防止多次实例化类带来的冗余数据，确保一个成员变量只有一个tat_field；<br />　　剩下的关键，就是tat::__field_register__了：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000ff">class</span>&nbsp;__field_register__<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__field_register__(tat_class&nbsp;*class_ptr,unsigned&nbsp;<span style="color: #0000ff">long</span>&nbsp;offset,std::<span style="color: #0000ff">string</span>&nbsp;key)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tat_field&nbsp;field(offset,key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class_ptr-&gt;add_field(field);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};</div><br />　　没有什么神秘的地方，这个东西就这么完成了。<br />　　差点忘了TestClass的声明：<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px; border-image: initial"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"fieldref.h"<br /><br /><span style="color: #0000ff">class</span>&nbsp;TestClass<br />{<br /><span style="color: #0000ff">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;TestClass(<span style="color: #0000ff">void</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;~TestClass(<span style="color: #0000ff">void</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CLASS_REGISTER(TestClass)<br />&nbsp;&nbsp;&nbsp;&nbsp;FIELD_REGISTER(<span style="color: #0000ff">public</span>,<span style="color: #0000ff">long</span>,_long_f,TestClass)<br />&nbsp;&nbsp;&nbsp;&nbsp;FIELD_REGISTER(<span style="color: #0000ff">public</span>,<span style="color: #0000ff">int</span>,_int_f,TestClass)<br />&nbsp;&nbsp;&nbsp; FIELD_REGISTER(<span style="color: #0000ff">public</span>,std::<span style="color: #0000ff">string</span>,_str_f,TestClass)<br />&nbsp;&nbsp;&nbsp;&nbsp;FIELD_REGISTER(<span style="color: #0000ff">public</span>,std::vector&lt;<span style="color: #0000ff">int</span>&gt;,_vec_f,TestClass)<br />};</div><br />　　好吧，如果说到实际应用的问题，洒家确实没有考虑太多，反正测试函数能跑，结果也对了，洒家也就满足了，就单纯的当做是一次实验，或者是学习而已。</div> <img src ="http://www.cppblog.com/0xfff/aggbug/172716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/0xfff/" target="_blank">廷</a> 2012-04-25 13:18 <a href="http://www.cppblog.com/0xfff/archive/2012/04/25/172716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>