struct Unique(T)

ChrisG christopher.gassib at gmail.com
Wed Nov 6 16:07:23 PST 2013


Hi, I've been following the D language off and on for several 
years, have read Andrei's D book, but haven't ever posted here 
before. Mostly, I come from a C++ and C# background. Recently, I 
was playing with D using the derelict bindings for the SDL 
library.

The SDL library uses handles in the form of struct pointers for 
resource management. In C++ I like using unique and shared 
pointers to manage C handles. Additionally, I like being able to 
specify custom clean up functions for specific resources. For 
example:

typedef std::unique_ptr<HandleType, HandleDeleter> handle_ptr;

My question is: what's the status of D's struct Unique? It looks 
like struct RefCounted is current, but I can't tell with Unique. 
There's several comments in the source that say: doesn't work 
yet. It seems like some of it could be made to work as intended. 
For example, the commented out code to disallow construction via 
an lvalue:

// this(U)(ref Unique!(U) u) = null; // commented out
// this(this) = null;

Couldn't this be written:

@disable this(U)(ref Unique!(U) u);
@disable this(this);

Seems to work when I try it. It stopped the copy from working, 
but I can still do a move. Like this:

Unique!(int) i1 = new int;
Unique!(int) i2 = move(i1); // works!

Next, I'd like to be able to use a custom deleter. For example, a 
naive implementation I could write would be something like:

struct Unique2(T, string D = "delete")
{
...
     ~this()
     {
         debug(Unique2) writeln("Unique destructor of ", (_p is 
null)? null: _p);
         if (_p !is null)
         {
             mixin(""~D~" (_p);"); // delete _p;
             _p = null;
         }
     }
...

So, I could do things like:

Unique2!(int, "free") i1 = cast(int*)malloc(int.sizeof); // lame 
example

A real implementation would allow more interesting deleters in 
the form of delegates, but I'm already stretching my D skillz.

Anyway, am I missing something here? Is there a better D language 
feature I'm not thinking about that provides the same 
functionality as C++'s std::unique_ptr<> with custom deleters; 
besides putting scope (exit) everywhere?

-Chris


More information about the Digitalmars-d-learn mailing list