• <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>

            qiezi的學習園地

            AS/C/C++/D/Java/JS/Python/Ruby

              C++博客 :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::
            新特性:
            1、給委托增加ptr屬性,指向委托所綁定的對象。
            這是一個語法糖,dg.ptr被轉化為cast(void*)dg,它只能作右值,所以除了能讀取它以外,在語法上禁止對它賦值。要想把委托綁定到不同的對象,你只能自己實現:

            class?Foo{
            ????
            int?foo;
            public:
            ????
            this(int?foo){
            ????????
            this.foo?=?foo;
            ????}

            ????
            void?bar(){
            ????????writefln(foo);
            ????}
            }

            void?main(){

            ????alias?
            void?delegate()?DG;
            ????DG?dg?
            =?&(new?Foo(1)).bar;

            ????Foo[
            10]?foos;
            ????
            foreach(int?i,?inout?Foo?foo;?foos){
            ????????foo?
            =?new?Foo(i);
            ????}

            ????
            void**?ptr?=?cast(void**)&dg;
            ????
            foreach(Foo?foo;?foos){
            ????????
            *ptr?=?cast(void*)foo;
            ????????dg();
            ????}
            }

            這種方式也不是我們所希望的,一般來說委托綁定到多個對象時,因為是取到某成員函數指針,再進行綁定。比如模擬一個ActiveSupport所擴展的一個ruby.Array#map用法:

            import?std.stdio;

            class?Foo{
            ????
            int?foo;
            public:
            ????
            this(int?foo){
            ????????
            this.foo?=?foo;
            ????}

            ????
            void?bar(){
            ????????writefln(foo);
            ????}
            }

            class?Array(T){
            ????
            private:
            ????T[]?data;

            ????
            public:
            ????
            this(T[]?data){
            ????????
            this.data?=?data[0?..?length];
            ????}

            ????
            void?map(void?function()?func){
            ????????
            void?delegate()?dg;
            ????????
            void**?funcPtr?=?cast(void**)&dg?+?1;
            ????????
            *funcPtr?=?func;
            ????????
            void?**?ptr?=?cast(void**)&dg;
            ????????
            foreach(T?v;?data){
            ????????????
            *ptr?=?cast(void*)v;
            ????????????dg();
            ????????}
            ????}
            }

            void?main(){
            ????auto?arr?
            =?new?Array!(Foo)([new?Foo(1),?new?Foo(2),?new?Foo(3)]);
            ????arr.map(
            &Foo.bar);
            }

            是的,delegate內部保存了2個指針,所以我們可以容易地hack它。

            [注:上面的main函數中數組直接量賦給棧對象也是這個版本中新增的內容,顯然只能用于static對象是很雞肋的。這里簡單帶過不提。]

            [注:上面這個map的模擬并不是ActiveSupport的map擴展的全部用途,那個map還是收集返回值,這里只演示調用語法。ActiveSupport中擴展的map調用語法是map(&:to_s),就可以收集到數組中所有元素調用to_s后的返回值。]

            2、給內嵌內的實例增加outer屬性,指向外層對象。

            import?std.stdio;

            class?Outer{
            ????
            class?Inner{}

            ????
            this(){
            ????????Inner?inner?
            =?new?Inner;
            ????????inner.outer.foo();
            ????}

            ????
            void?foo(){
            ????????writefln(
            "foo");
            ????}
            }

            void?main(){
            ????Outer?outer?
            =?new?Outer;
            }

            這個特性可能應用并不是很廣吧。

            3、mixin多個析構函數。

            template?A(){
            ????
            this(){
            ????}
            ????
            ~this(){
            ????????writefln(
            "A::~A()");
            ????}
            }

            template?B(){
            ????
            ~this(){
            ????????writefln(
            "B::~B()");
            ????}
            }

            class?C{
            ????mixin?A;
            ????mixin?B;
            }

            void?main(){
            ????C?c?
            =?new?C;
            ????delete?c;
            }

            這些析構函數會和mixin相反的順序執行。我不明白的是,為什么不讓mixin多個構造函數?為何不讓這些構造函數晚于被mixin的類(上面的C類)的構造函數,并按mixin進來的順序執行?
            posted on 2006-10-05 09:23 qiezi 閱讀(657) 評論(5)  編輯 收藏 引用 所屬分類: D
            久久久久99精品成人片三人毛片| 伊人久久精品无码av一区| 97久久国产综合精品女不卡| 久久只有这里有精品4| 欧美丰满熟妇BBB久久久| 久久91精品国产91久久小草| 一本大道久久a久久精品综合| 久久乐国产精品亚洲综合| 亚洲国产精品久久久天堂| 精品视频久久久久| 国产精品毛片久久久久久久| 一级做a爰片久久毛片毛片| 久久夜色精品国产亚洲| 色欲久久久天天天综合网精品| 久久99精品久久只有精品| 久久婷婷国产剧情内射白浆| 久久久久国产精品三级网| 中文字幕久久久久人妻| 99热成人精品免费久久| 青青草国产精品久久| 亚洲精品国产美女久久久| 久久久精品波多野结衣| 狠狠色丁香久久综合婷婷| 亚洲va中文字幕无码久久不卡| 久久久91人妻无码精品蜜桃HD| 久久午夜无码鲁丝片| 久久久久久久综合狠狠综合| 久久九九免费高清视频| 嫩草影院久久国产精品| 99麻豆久久久国产精品免费| 久久精品99久久香蕉国产色戒| 婷婷久久久亚洲欧洲日产国码AV| 亚洲国产精品无码久久九九| 精品久久久久久无码国产| 国产精品成人精品久久久| 国产高清国内精品福利99久久| 国产成人精品免费久久久久| 麻豆亚洲AV永久无码精品久久| 久久综合精品国产二区无码| 亚洲αv久久久噜噜噜噜噜| 久久66热人妻偷产精品9|