• <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>
            隨筆 - 31  文章 - 128  trackbacks - 0
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(5)

            隨筆分類(38)

            隨筆檔案(31)

            收藏夾(4)

            College

            High School

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 55886
            • 排名 - 407

            最新評(píng)論

            • 1.?re: [yc]詳解link
            • 面試的時(shí)候面試官就問(wèn)過(guò)我什么是編譯和鏈接,我說(shuō)編譯就是把代碼文件生成目標(biāo)文件,鏈接就是把目標(biāo)文件生成可執(zhí)行文件,他說(shuō)不對(duì),又問(wèn)我什么是動(dòng)態(tài)鏈接,還問(wèn)我預(yù)編譯都做什么處理。。。都在這里找到了答案!!!!
            • --王至乾
            • 2.?re: [yc]詳解link
            • @劉偉
              我是說(shuō)博主,不是叫你啊
            • --溪流
            • 3.?re: [yc]詳解link
            • 誰(shuí)是石老師,我不是哈@溪流
            • --劉偉
            • 4.?re: [yc]詳解link
            • 石老師?我是溪流~
            • --溪流
            • 5.?re: [yc]詳解link
            • 期待樓主下文啊,多謝樓主了
            • --劉偉

            閱讀排行榜

            評(píng)論排行榜

            看了546@C++@Freecity之后,發(fā)覺(jué)非常有意思,由此產(chǎn)生一些想法

            很多時(shí)候?qū)懸粋€(gè)類的時(shí)候,需要多個(gè)模版參數(shù),例如一個(gè)遺傳算法的算法類,需要一個(gè)模版參數(shù)來(lái)指定交配方式,另一個(gè)模版參數(shù)來(lái)指定子代選擇的方式,還要一個(gè)參數(shù)來(lái)指定變異的方式。那么一般來(lái)說(shuō),這個(gè)類會(huì)寫(xiě)成:

            template<class T                                                //描述問(wèn)題的一個(gè)類
                    , class CrossPolicy = AvgCrossPolicy                        //雜交方式
                    , class SelectPolicy = DefaultSelectPolicy                //子代選擇的方式
                    , class VariationPolicy = ReverseVariationPolicy>        //變異方式
            class Gene
                    : private AvgCrossPolicy
                    , private SelectPolicy
                    , private VariationPolicy
            {
                    ....
            };

            這樣用戶要使用該類的時(shí)候,可以直接指定T,就行了,然而如果要指定變異方式,那么就必須把所有的參數(shù)都顯式的寫(xiě)出來(lái),很不方便

            546提供了一種有效的方法,可以讓我們僅僅指定變異參數(shù),而不用寫(xiě)出另兩個(gè)Policy
            甚至允許我們以任意的順序書(shū)寫(xiě)幾個(gè)Policy參數(shù),都不會(huì)有問(wèn)題

            預(yù)備知識(shí):
            TypeList
            一個(gè)TypeList是一個(gè)類型的容器
            template <typename Type_, typename Next_>
            struct TypeList
            {
                    typedef Type_ Type;
                    typedef Next_ Next;
            };
            這就是一個(gè)TypeList。
            看這個(gè)寫(xiě)法,是不是像一個(gè)鏈表?
            首先定義一個(gè)類型來(lái)表示鏈表尾:class NullType{};
            現(xiàn)在一個(gè)包含了2個(gè)類型的TypeList就可以寫(xiě)為:
            TypeList<T1, TypeList<T2, NullType>  >

            如何在一個(gè)TypeList中查找一個(gè)類型的子類?
            首先要有一個(gè)IsDerivedFrom<Base, T>
            這個(gè)比較簡(jiǎn)單
            template<class Base, class T>
            class IsDerivedFrom
            {
                    struct large{char a[2];};
                    static char pred(Base*);
                    static large pred(...);
            public:
                    enum {Is = sizeof(pred((T*)0)) == sizeof(char)};
            };

            然后FindChild就容易了
            template <class List, class Base>
            struct FindChild
            {
                    template <bool IsChild>
                    struct Select
                    {
                            typedef typename List::Type Type;
                    };

                    template <>
                    struct Select<false>
                    {
                            typedef typename FindChild<typename List::Next, Base>::Type Type;
                    };

                    typedef typename Select<IsDerivedFrom<Base, typename List::Type> >::Type Type;
            };

            當(dāng)然還要對(duì)一些特殊情況進(jìn)行特化,例如NullType
            template <class Base>
            struct FindChild<NullType, Base>
            {
                    typedef NullType Type;
            };
            這里使用NullType來(lái)表明沒(méi)找到

            實(shí)際操作:
            首先需要給3個(gè)Policy3個(gè)基類,分別叫
            class AvgCrossPolicyBase{};
            class SelectPolicyBase{};
            class VariationPolicyBase{};
            內(nèi)容為空就行了,這樣也沒(méi)有虛函數(shù)調(diào)用的開(kāi)銷


            然后聲明一個(gè)類來(lái)表示默認(rèn)情況:
            class DefaultPolicy{};

            定義一個(gè)宏
            #define TYPELIST_3_N(a, b, c) TypeList<a, TypeList<b, TypeList<c, NullType> > >

            下面要寫(xiě)一些選擇器,用于把合適的類型選擇出來(lái),如果沒(méi)找到,則要使用默認(rèn)的類型
            template <class List, class Base, class DefaultType>
            struct Selector
            {
                    template <class RetType>
                    struct Judge
                    {
                            typedef RetType Type;
                    };
                   
                    template<>
                    struct Judge<NullType>
                    {
                            typedef DefaultType Type;
                    };
                    typedef typename Judge<typename FindChild<List, Base>::Type >::Type Type;
            };

            好啦,現(xiàn)在整個(gè)類的聲明可以寫(xiě)為

            template<class T
                    , class CrossPolicy_ = DefaultPolicy
                    , class SelectPolicy_ = DefaultPolicy
                    , class VariationPolicy_ = DefaultPolicy     //其后的參數(shù)用戶不可指定
                    , class List = TYPELIST_3_N(CrossPolicy_, SelectPolicy_, VariationPolicy_)
                    , class CrossPolicy = typename Selector<List, CrossPolicyBase,  AvgCrossPolicy>::Type
                    , class SelectPolicy = typename Selector<List,  SelectPolicyBase,  DefaultSelectPolicy>::Type
                    , class VariationPolicy = typename Selector<List,  VariationPolicyBase,  ReverseVariationPolicy>::Type
                    >
            class Gene
                    : private CrossPolicy
                    , private SelectPolicy
                    , private VariationPolicy
            {
                   
                    ....
            };


            其中第4-7個(gè)參數(shù)(List,CrossPolicy,SelectPolicy和VariationPolicy)是不由用戶指定的,僅僅是為了起一個(gè)別名
            第一個(gè)參數(shù)T必須指定,然后2,3,4這3個(gè)參數(shù)就可以任意的改變順序了
            例如,可以寫(xiě)Gene<T, DefaultSelectPolicy, AvgCrossPolicy>而不會(huì)有任何問(wèn)題
            如果不想要最后面幾個(gè)參數(shù)的話也行,但是代碼就要稍微長(zhǎng)一點(diǎn)
            而且最好在類里面進(jìn)行3個(gè)typedef
            typedef typename Selector<List, CrossPolicyBase,  AvgCrossPolicy>::Type CrossPolicy;
            等,以便在實(shí)現(xiàn)的時(shí)候使用

            posted on 2006-07-24 01:06 shifan3 閱讀(1010) 評(píng)論(9)  編輯 收藏 引用 所屬分類: templateC++

            FeedBack:
            # re: 亂序Policy手法 2006-07-24 09:25 小明
            華麗是華麗,可是不實(shí)在,工程師慎用  回復(fù)  更多評(píng)論
              
            # re: 亂序Policy手法 2006-07-24 12:06 Arcrest
            靜態(tài)的多態(tài)還是有用的時(shí)候,C++ Modern Design詳解
            當(dāng)然項(xiàng)目中的話,維護(hù)人員要求高了點(diǎn)。。。

              回復(fù)  更多評(píng)論
              
            # re: 亂序Policy手法 2006-07-24 12:12 Francis Arcanum
            這種東西的特點(diǎn)就是,不管怎么搞,也都是編譯錯(cuò)誤
            而編譯錯(cuò)誤怎么詭異也比運(yùn)行錯(cuò)誤容易解決  回復(fù)  更多評(píng)論
              
            # re: 亂序Policy手法 2006-10-22 08:42 pluskid
            T_T
            看不懂 C++ 代碼~~~
            不過(guò),lisp 里面支持亂序參數(shù)是使用keyword來(lái)支持。例如:
            (defun foo (&key foo (bar 'default-bar))
            (format t "~A ~A~%" foo bar))

            然后可以這樣調(diào)用:
            (foo :bar 'new-bar)
            NIL NEW-BAR

            or
            (foo :bar 'new-bar :foo 'new-foo)
            NEW-FOO NEW-BAR

            or
            (foo :foo 'new-foo)
            NEW-FOO DEFAULT-BAR

            恩,也許可以參考一下,通過(guò)名字來(lái)指定是哪個(gè)參數(shù)。  回復(fù)  更多評(píng)論
              
            # re: 亂序Policy手法 2006-10-22 09:56 Francis Arcanum
            通過(guò)名字取參數(shù)C++有另外一套做法,可以參見(jiàn)boost.parameter
            這個(gè)可以連名字都不需要,哇哈哈哈哈  回復(fù)  更多評(píng)論
              
            # re: [yc]亂序Policy手法 2007-05-20 07:38 pluskid
            寒~~發(fā)現(xiàn)原來(lái)我以前看過(guò)這篇的。不過(guò)現(xiàn)在居然能看懂了,看來(lái)自己也是有進(jìn)步的,哈哈~  回復(fù)  更多評(píng)論
              
            # re: [yc]亂序Policy手法[未登錄](méi) 2007-08-21 20:17 Jarod
            突然發(fā)現(xiàn)有個(gè)例子是遺傳算法,莫非朋友也是搞智能的?  回復(fù)  更多評(píng)論
              
            # re: [yc]亂序Policy手法 2007-08-22 10:27 Francis Arcanum
            @Jarod
            呵呵,不是,只不過(guò)有朋友給我介紹過(guò),覺(jué)得這個(gè)例子很合適就用上了  回復(fù)  更多評(píng)論
              
            # re: [yc]亂序Policy手法 2009-10-25 12:47 hlysh
            看不懂....唉  回復(fù)  更多評(píng)論
              
            人妻无码αv中文字幕久久琪琪布| 精品国产91久久久久久久| 理论片午午伦夜理片久久 | 久久久久亚洲精品无码网址| 久久久久无码专区亚洲av| 亚洲精品无码久久千人斩| 成人国内精品久久久久影院VR| 色婷婷久久久SWAG精品| 久久91精品国产91久久小草| 亚洲国产香蕉人人爽成AV片久久| 久久av无码专区亚洲av桃花岛| 久久国产视屏| 香港aa三级久久三级| 亚洲精品美女久久久久99| 久久精品无码一区二区三区免费| 伊人久久大香线蕉av一区| 久久国产成人亚洲精品影院| 久久久国产乱子伦精品作者 | 久久精品aⅴ无码中文字字幕重口| 久久久久18| 精品久久久久久无码中文字幕| 久久青青草原精品国产| 国产成人精品久久| 久久天天躁狠狠躁夜夜2020 | 亚洲国产视频久久| 久久久久18| 久久天天躁狠狠躁夜夜2020| 伊人久久免费视频| 91精品国产91久久| 精品久久久久久| 久久精品国产亚洲沈樵| 无码人妻精品一区二区三区久久久 | 久久精品国产第一区二区| 久久精品一区二区| 久久99精品国产99久久| 97久久超碰国产精品2021| 国产成年无码久久久久毛片| 99久久精品国产免看国产一区| 久久精品国产亚洲av水果派| 99久久综合狠狠综合久久止| 国产精品女同久久久久电影院|