• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            cpp小菜園

            簡(jiǎn)單即是複雜

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              2 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(3)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            2012年11月4日 #


            一直都被fft吸引著,翻了下《信號(hào)與系統(tǒng)》,用純c++實(shí)現(xiàn)了一遍,算是把原理弄透了,然後想到了多項(xiàng)式擬合,翻書(shū)翻到了內(nèi)積空間,還淺淺地了解一下小波分析,覺(jué)得用隨筆來(lái)把原理說(shuō)透恐怕篇幅不夠,還是先弄個(gè)文檔什麼的吧
            這裡先放幾張圖開(kāi)個(gè)頭,有時(shí)間補(bǔ)全再說(shuō)吧,顯示部份用了mgl



            主要就是驗(yàn)證一下把方波拆分成不同頻率的信號(hào)

            posted @ 2012-11-04 00:10 廷 閱讀(247) | 評(píng)論 (0)編輯 收藏

            2012年4月25日 #


              最近(其實(shí)也有一段時(shí)間了),在c++項(xiàng)目中需要用到類(lèi)似java的反射機(jī)制,時(shí)間也比較趕,只能周?chē)纯从袥](méi)有現(xiàn)成的庫(kù)可用了,找到的資料也不算少,但多數(shù)都是關(guān)于動(dòng)態(tài)創(chuàng)建類(lèi)的,有點(diǎn)像工廠模式,而我需要的,是把實(shí)體類(lèi)中的屬性反射出來(lái)。最后,找到了一個(gè)叫LibReflection的東西,雖然后來(lái)還是沒(méi)用上這個(gè),但是稍微看了一下代碼,還是有不少收獲,所以就在這里記錄下來(lái)了,當(dāng)做學(xué)習(xí),也當(dāng)做對(duì)這個(gè)庫(kù)的一個(gè)分析吧。
              LibReflection是屬性和函數(shù)反射都有實(shí)現(xiàn)的,而整個(gè)庫(kù)竟然就一個(gè)h文件,本人精力有限,只把屬性反射抽取出來(lái),相信離實(shí)際應(yīng)用也有距離,如果有人路過(guò)看到,請(qǐng)?bào)w諒別拍磚了。
              那么,首先看一下使用:

                TestClass inst;
                tat::tat_class *test_class = TestClass::get_class_ptr();
                std::map<std::string,tat::tat_field> field_map = test_class->get_fields();
                tat::tat_field test_vec_field = field_map.find("_vec_f")->second;
                std::vector<int> vec;
                test_vec_field.get(&inst,vec);
                vec.push_back(22);
                test_vec_field.set(&inst,vec);
                std::cout<<inst._vec_f[0]<<std::endl;

              TestClass類(lèi)先不給出,反正就是該類(lèi)有一個(gè)名字為“_vec_f”的屬性,類(lèi)型是std::vector<int>,然后這段代碼通過(guò)反射修改_vec_f的內(nèi)容。。至于tat_class和tat_field,相信熟悉java的人都能猜出是什么了。
              獲取及設(shè)置一個(gè)實(shí)例的成員變量的值不是難事,用一個(gè)宏就可以了:

            #define _OFFSET_(_Obj_Ty,_Key)                                                    \
                ((unsigned long)(&((_Obj_Ty *)0)->_Key))

               這個(gè)宏應(yīng)該也不難理解,就是獲取成員變量相對(duì)實(shí)例指針的偏移值。而關(guān)鍵問(wèn)題是,如何通過(guò)變量名稱就能查找出這個(gè)偏移呢?如何在變量初始化的時(shí)候就能記錄下這個(gè)偏移呢?我們可以通過(guò)宏來(lái)聲明變量,那么聲明的時(shí)候就可以做一些事情了,但具體做些什么,還是沒(méi)頭緒。
              這個(gè)問(wèn)題自己思考了一段時(shí)間,無(wú)果。然后看了一下實(shí)現(xiàn),深感自己的基礎(chǔ)還沒(méi)過(guò)關(guān),其實(shí)說(shuō)白了就是兩個(gè)東西:構(gòu)造函數(shù)、靜態(tài)成員變量。
              我們的目標(biāo)是很明確的,要做到j(luò)ava的效果,結(jié)合上面那個(gè)宏,也不難想象出Class和Field類(lèi)的樣子(這里是tat_class和tat_field),tat_class無(wú)非就是保存了一個(gè)map,key是屬性的名稱,value是tat_field,至于tat_field就簡(jiǎn)單了,核心就是保存內(nèi)存的偏移值,再提供操作值的接口就可以了。
              先來(lái)看看tat_class:

                class tat_class
                {
                private:
                    std::map<std::string,tat_field> _field_map;
                    std::string _key;
                public:
                    std::map<std::string,tat_field> get_fields()
                    {
                        return this->_field_map;
                    }
                    tat_field get_field(std::string key)
                    {
                        std::map<std::string,tat_field>::iterator itr = _field_map.find(key);
                        return (*itr).second;
                    }
                    void add_field(const tat_field &field)
                    {
                        _field_map.insert(std::pair<std::string,tat_field>(field.get_key(),field));
                    }
                };

              沒(méi)有什么理解上的難點(diǎn)吧。
              然后看看tat_field:

                class tat_field
                {
                private:
                    unsigned long _offset;
                    std::string _key;
                public:
                    tat_field(unsigned long offset,std::string key):_offset(offset),_key(key){}
                    tat_field(const tat_field &field)
                    {
                        this->_offset = field._offset;
                        this->_key = field._key;
                    }
                public:
                    template<typename _Obj_Ty,typename _Value_Ty>
                    void get(_Obj_Ty *obj,_Value_Ty &value)
                    {
                        value = *((_Value_Ty *)((unsigned char *)obj + _offset));
                    }
                    template<typename _Obj_Ty,typename _Value_Ty>
                    void set(_Obj_Ty *obj,const _Value_Ty &value)
                    {
                        *((_Value_Ty *)((unsigned char *)obj + _offset)) = value;
                    }
                    std::string get_key() const
                    {
                        return this->_key;
                    }
                };

              變量值的get和set函數(shù)使用了模板,這是為了使用的時(shí)候能作簡(jiǎn)單的類(lèi)型推斷。
              然后就是重點(diǎn)了,如何在聲明類(lèi)的時(shí)候就把tat_class注入呢?如前面說(shuō)的,靜態(tài)成員變量:

            #define CLASS_REGISTER(_Obj_Ty)                                                    \
            public:                                                                            \
                static tat::tat_class * get_class_ptr()                                        \
                {                                                                            \
                    static tat::tat_class __class_##_Obj_Key##__;                            \
                    return &__class_##_Obj_Key##__;                                            \
                }

              這個(gè)宏做了兩件事:第一,聲明靜態(tài)函數(shù)get_class_ptr(),返回tat_class類(lèi)型,第二,當(dāng)然就是初始化tat_class了,因?yàn)橥瑯邮庆o態(tài),所以不同的實(shí)例就共享了。
              接下來(lái)是另一個(gè)重點(diǎn),如何在聲明成員變量的時(shí)候把tat_field注入到tat_class中,還是用宏解決:

            #define FIELD_REGISTER(_Access,_Field_Ty,_Field_Key,_Obj_Ty)                    \
            _Access:                                                                        \
                _Field_Ty _Field_Key;                                                        \
            private:                                                                        \
                class __field_register_##_Field_Key##__                                        \
                {                                                                            \
                public:                                                                        \
                    __field_register_##_Field_Key##__()                                        \
                    {                                                                        \
                        static tat::__field_register__ reg_##_Field_Key(                    \
                            _Obj_Ty::get_class_ptr(),                                        \
                            _OFFSET_(_Obj_Ty,_Field_Key),                                    \
                            #_Field_Key);                                                    \
                    }                                                                        \
                }_Field_Key##_register;

              分析這個(gè)宏,首先當(dāng)然是聲明變量了;然后就是一個(gè)神秘的類(lèi):__field_register_##_Field_Key##__,這個(gè)類(lèi)就只有一個(gè)構(gòu)造函數(shù),構(gòu)造函數(shù)里面又是一個(gè)靜態(tài)變量,類(lèi)型是tat::__field_register__,可以想象得到,既然tat_class已經(jīng)可以聲明出來(lái)了,tat_field自然也沒(méi)有難度,但聲明是不足夠的,還需要放到tat_class的map里面才算完成,在聲明一個(gè)變量的時(shí)候,能做事的地方,我只能想到是構(gòu)造函數(shù)了,所以就有了剛剛那個(gè)神秘的類(lèi),那個(gè)類(lèi)的唯一作用就是其構(gòu)造函數(shù),而構(gòu)造函數(shù)里面聲明靜態(tài)變量,則是防止多次實(shí)例化類(lèi)帶來(lái)的冗余數(shù)據(jù),確保一個(gè)成員變量只有一個(gè)tat_field;
              剩下的關(guān)鍵,就是tat::__field_register__了:

                class __field_register__
                {
                public:
                    __field_register__(tat_class *class_ptr,unsigned long offset,std::string key)
                    {
                        tat_field field(offset,key);
                        class_ptr->add_field(field);
                    }
                };

              沒(méi)有什么神秘的地方,這個(gè)東西就這么完成了。
              差點(diǎn)忘了TestClass的聲明:

            #include "fieldref.h"

            class TestClass
            {
            public:
                TestClass(void);
                ~TestClass(void);

                CLASS_REGISTER(TestClass)
                FIELD_REGISTER(public,long,_long_f,TestClass)
                FIELD_REGISTER(public,int,_int_f,TestClass)
                FIELD_REGISTER(public,std::string,_str_f,TestClass)
                FIELD_REGISTER(public,std::vector<int>,_vec_f,TestClass)
            };

              好吧,如果說(shuō)到實(shí)際應(yīng)用的問(wèn)題,灑家確實(shí)沒(méi)有考慮太多,反正測(cè)試函數(shù)能跑,結(jié)果也對(duì)了,灑家也就滿足了,就單純的當(dāng)做是一次實(shí)驗(yàn),或者是學(xué)習(xí)而已。
            posted @ 2012-04-25 13:18 廷 閱讀(4056) | 評(píng)論 (0)編輯 收藏

            97精品国产97久久久久久免费 | 色综合久久中文字幕无码| 亚洲精品国产自在久久| 欧美麻豆久久久久久中文| 波多野结衣AV无码久久一区| 久久精品国产亚洲av麻豆色欲| 9191精品国产免费久久| 欧美久久亚洲精品| 国内精品伊人久久久久| 久久天天日天天操综合伊人av| 国内精品伊人久久久久777| 91精品国产91久久久久久| 欧美亚洲日本久久精品| 精品久久久久久国产潘金莲| 久久久久亚洲?V成人无码| 久久婷婷国产综合精品| 亚洲国产天堂久久综合网站| 久久婷婷色综合一区二区| 中文字幕亚洲综合久久| 亚洲av伊人久久综合密臀性色| 久久99久久无码毛片一区二区| 久久精品国产亚洲AV麻豆网站| 亚洲AⅤ优女AV综合久久久| 成人亚洲欧美久久久久| 久久人人爽人人爽人人片AV不| 亚洲伊人久久成综合人影院| 久久综合丁香激情久久| 久久夜色精品国产欧美乱| 久久无码中文字幕东京热| 久久电影网| 国内精品欧美久久精品| 99久久www免费人成精品| 91精品国产综合久久婷婷| 久久一日本道色综合久久| 久久人人爽人人爽人人片AV麻烦 | 波多野结衣AV无码久久一区| 欧美激情精品久久久久久| 久久播电影网| 日日狠狠久久偷偷色综合免费| 最新久久免费视频| 一本久道久久综合狠狠躁AV|