D needs emplacement new

Namespace via Digitalmars-d digitalmars-d at puremagic.com
Sat Apr 25 11:50:57 PDT 2015


On Saturday, 25 April 2015 at 18:46:52 UTC, Adam D. Ruppe wrote:
> You could just call the constructor again to reuse an object. I 
> guess you should also reinitialize the memory, but that's 
> pretty easy too.
>
> Instead of placement new to reuse an object, make a function 
> like reset() or reinitialize() that destructs the first, then 
> copies the init back over and calls the constructor again.
>
>
>
> Something like this:
>
> void reinitialize(ClassName, CtorArgs...)(ClassName obj, 
> CtorArgs args) {
>     assert(typeid(obj) == typeid(ClassName),
>         "Don't use this on interfaces or base classes!");
>     static if(__traits(hasMember, obj, "__dtor"))
>         obj.__dtor();
>     (cast(void*) obj)[0 .. typeid(obj).init.length] = 
> typeid(obj).init[];
>     static if(__traits(hasMember, obj, "__ctor"))
>         obj.__ctor(args);
> }
>
>
> Then, you create it however up front and just reinitialize it 
> when you're all set. I think that is a bit clearer in meaning 
> than placement new as well.

Nice name, fits better. But that should be in phobos, don't you 
think?


More information about the Digitalmars-d mailing list