Am 13.07.2013 17:15, schrieb bearophile:
(Sorry, this post has gone in this newsgroup by mistake, but it's a
small mistake.)


To change and understand your code a bit (now the ComposeClass
constructor is a template) I have removed some of the tests and debug
code, but they should be added back later:


/*
string listAvailableCtors(T)() {
     string result = "";
     foreach(t; __traits(getOverloads, T, "__ctor"))
         result ~= typeof(t).stringof ~ "\n";
     return result;
}
*/

struct DefaultCtor {} //call default ctor type
enum defaultCtor = DefaultCtor();

struct ComposeClass(T) if (is(T == class)) {
     void[__traits(classInstanceSize, T)] _classMemory = void;
     bool m_destructed = false;

     @property T _instance() {
         return cast(T)_classMemory.ptr;
     }

     @property const(T) _instance() const {
         return cast(const(T))_classMemory.ptr;
     }

     alias _instance this;

     @disable this();
     @disable this(this);

     this(DefaultCtor) {
         // _classMemory[] = typeid(T).init[]; // needed?
         _instance.__ctor;
     }

     this(Targs...)(Targs args) {
         _classMemory[] = typeid(T).init[];
         _instance.__ctor(args);
     }

     ~this() {
         if (!m_destructed) {
             _instance.destroy;
             m_destructed = true;
         }
     }
}

// Usage example ----------

class Foo {
     int i, j;
     this() {
         this.i = 5;
     }

     this(int ii) {
         this.i = ii;
     }
}

class Bar {
     ComposeClass!Foo f;

     this() {
         //f = typeof(f)(defaultCtor);
         f = typeof(f)(2); // alternative
     }
}

void main() {
     import std.stdio;
     auto bar = new Bar;
     writeln(bar.f.i);
     bar.f.i = 1;
     writeln(bar.f.i);
}


This code is unfinished.
Is the assignment needed in this(DefaultCtor)?

This code contains some sharp edges (for the D programmer and even for
the compiler, I have opened a new bug report:
http://d.puremagic.com/issues/show_bug.cgi?id=10629 ), for me it's easy
to get wrong, hard to get right & good, and I believe it's of general
usefulness, so I think it's fit for Phobos.

But isn't it a replacement for Phobos Scoped?

Bye,
bearophile

I just noticed that this still does not work. Even with dmd 2.063 I get the error message:

main.d(28): Error: template main.ComposeClass!(Object).ComposeClass.__ctor(Targs...)(Targs args) conflicts with constructor main.ComposeClass!(Object).ComposeClass.this at main.d(20)

If you have a templated constructor you can't have any non templated constructors. (http://d.puremagic.com/issues/show_bug.cgi?id=4749)
So a version with a templated constructor is still not doable at the moment.

Kind Regards
Benjamin Thaut

Reply via email to