Call destructor directly.

Jonathan M Davis jmdavisProg at gmx.com
Sun Oct 20 22:16:46 PDT 2013


On Monday, October 21, 2013 05:53:46 Agustin wrote:
> On Monday, 21 October 2013 at 03:50:24 UTC, Agustin wrote:
> > On Monday, 21 October 2013 at 03:46:33 UTC, Jonathan M Davis
> > 
> > wrote:
> >> On Monday, October 21, 2013 05:07:02 Agustin wrote:
> >>> What about constructor?. My current code is:
> >>> 	T allocate(T : Object, A...)(auto ref A arguments) {
> >>> 	
> >>> 		auto pMemory = rawAllocate(__traits(classInstanceSize, T),
> >>> 
> >>> T.alignof); // Return void*
> >>> 
> >>> 		emplace!T(cast(T *)pMemory, arguments);
> >>> 		return cast(T) pMemory;
> >>> 	
> >>> 	}
> >>> 
> >>> Doesn't seems to work, and i can't find any good documentation
> >>> about it.
> >> 
> >> IIRC, the constructor should be name __ctor.
> >> 
> >> - Jonathan M Davis
> > 
> > no property 'opCall' for type 'Main.MyClass' :(
> 
> Trait allMember return "__ctor", but seems like i cannot call it
> directly:
> 
> (cast(T)pMemory).__ctor(arguments); // Being pMemory void*

If you want to see how to use emplace, I'd advise looking at 
std.typecons.RefCounted's implementation:

https://github.com/D-Programming-Language/phobos/blob/master/std/typecons.d#L3505

emplace calls the constructor for you, so I don't know why you'd be trying to 
call it. But you can look at emplace's implementation if you want to see how 
to call __ctor.

For structs:
https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L3976

For classes:
https://github.com/D-Programming-Language/phobos/blob/master/std/conv.d#L4716

I don't think that it'll work if the constructor is private though, so maybe 
that's your problem.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list