2011-01-08 11 views
8

D'de referans sayılan bir nesne oluşturmak için std.typecons.RefCounted!(T)'u nasıl kullanırsınız?Referansda sayılan bir nesneyi RefCounted kullanarak yapma! (T)

Kaynağa bakarak, std.array.Array'un dahili olarak ne yaptığını anlamaya çalıştım, ancak kaynağı okuyabildiğimde, yalnızca bir "yük yükünün" ne olduğunu ya da Bitsel yapılı kopyalama, bazı şeylerin iç ve dış yapıda niçin çoğaltıldığını da içerir.

Herkesin basit bir Win32 HANDLE paketini nasıl kullanacağı konusunda bir örnek veya bir bağlantı verebilir misiniz?

Teşekkürler!

cevap

9

Yasal Uyarı: Hak talebimi test etmedim, sadece documentation'u okuyun.

Yük, neyin depolandığını ifade etmektedir. Senin durumunda yükü Win32 HANDLE. KULP sadece bir tamsayı olduğu için tek yapmanız istemem: kolu kapsam dışına çıktığında

auto refHandle = RefCounted!HANDLE(WhatGetsMeAHandle()); 

Windows işlevi gerekir Çünkü

çağrılacak.

std.containers.Array öğesinde gördükleriniz, _payload adlı bir alana sahip olan Payload adlı bir yapıydı. Yapı, _payload aracılığıyla erişilen verinin depolanması olacak. Bu, daha sonra kullanılmak üzere bir dolaylılık seviyesi sağlar.

RefCounted'ın aslında used on the Array structure olduğunu fark edeceksiniz. Bu, bu yapının yıkıcısı sadece referans sayısı 0 olduğunda çağrılacağı anlamına gelir. Bu nedenle, Yük yükünün içindeki ~ bu(), KOLU'nuzu temizlemek istediğiniz yerdir.

Neler oluyor: struct bir değer türü olduğu için, yapının kapsam dışına çıktığı her seferinde yıkıcı adı verilir, Array için bir tane yoktur, ancak Yükleme RefCounted için bir destektir; böyle de adlandırılır. Ve sadece referans sayısı sıfıra ulaştığında, kendisini yükleyen kendisi için yıkıcıdır.

Şimdi, RefCounted'in kendisi bir referans semantiğine sahiptir, bu bir Array a'ya sahip olmanızın ardından otomatik b = a'ya atayabileceğiniz anlamına gelir; ve her şey kopyalanacaktır, ancak RefCounted'in postblits defined'a sahip olduğu anlamına gelir, yani veriler kopyalanmayacaktır, ancak referans sayısı artırılacaktır.

Şimdi ne istediğiniz için size bir sarıcı taslağı sunmaya çalışacağım. Yukarıdaki bilgileri görselleştirmenize yardımcı olabilir, ancak tamamen doğru olmayabilir. Bir şeyin düzeltilmesi gerekiyorsa bana bildirin.

struct MyWinWrapper { 
    struct Payload { 
     HANDLE _payload; 
     this(HANDLE h) { _payload = h; } 
     ~this() { freeHandleHere(_payload); } 

     // Should never perform these operations 
     this(this) { assert(false); } 
     void opAssign(MyWinWrapper.Payload rhs) { assert(false); } 
    } 

    private alias RefCounted!(Payload, RefCountedAutoInitialize.no) Data; 
    private Data _data; 

    this(HANDLE h) { _data = Data(h); } 
} 

Yapı için varsayılan kurucu olmadığından, muhtemelen bu yapıyı döndüren ücretsiz bir işlev sağlamak isteyeceksiniz.

+0

Detaylı cevap için teşekkür ederiz! Çok kolay görünüyorsun! :) – Mehrdad

+0

@Lambert, başlangıçta istediğim şeyi yapamayacağımı bilmediğim ilk kod snippet'ini kullanmamayı söyleyeceğim. Ama sonra ilgilendim ve öğrendiklerimi yazmaya başladım. –

+1

myWinWrapper için ctor yapmamalısınız '_data = Data (h);'? –

İlgili konular