• <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 閱讀(647) 評論(5)  編輯 收藏 引用 所屬分類: D
            中文字幕热久久久久久久| 91亚洲国产成人久久精品| 狠狠色丁香久久婷婷综合五月| 香蕉99久久国产综合精品宅男自| 久久久久久毛片免费播放| 亚洲国产精品综合久久一线| 狠狠人妻久久久久久综合蜜桃| 日本三级久久网| 国产成人无码精品久久久免费 | 久久综合久久自在自线精品自| 久久久WWW成人免费精品| 99热成人精品热久久669| 久久久精品国产sm调教网站| 久久国产亚洲高清观看| 一本色综合网久久| 漂亮人妻被黑人久久精品| 国产午夜福利精品久久2021 | 色欲综合久久躁天天躁| 久久经典免费视频| 午夜精品久久久久久久| 久久亚洲精品国产精品婷婷| 久久久久综合国产欧美一区二区| 97久久国产亚洲精品超碰热| 国产精品99精品久久免费| 久久久精品午夜免费不卡| 97视频久久久| 久久这里只有精品首页| 久久精品一本到99热免费| 国产女人aaa级久久久级| 久久精品视频一| 91久久婷婷国产综合精品青草| 国产一区二区精品久久| 国产精品久久毛片完整版| 亚洲精品乱码久久久久久蜜桃图片 | 久久w5ww成w人免费| 国产成人精品久久亚洲高清不卡 | 欧美精品九九99久久在观看| 久久午夜伦鲁片免费无码| 久久99热精品| 久久亚洲AV无码精品色午夜麻豆 | 国内精品久久久久久99蜜桃|