Call destructor directly.
Agustin
agustin.l.alvarez at hotmail.com
Sun Oct 20 22:59:06 PDT 2013
On Monday, 21 October 2013 at 05:40:13 UTC, Agustin wrote:
> On Monday, 21 October 2013 at 05:17:01 UTC, Jonathan M Davis
> wrote:
>> 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
>
> I'm silly the issue was at this line
>
> auto pMemory = rawAllocate(__traits(classInstanceSize, T),
> T.alignof);
>
> emplace(pMemory, arguments);
>
> Correct was
>
> auto pMemory = rawAllocate(__traits(classInstanceSize, T),
> T.alignof);
>
> emplace(&pMemory, arguments);
>
> Thanks guys
That didn't work, but after reading how emplace works, i had to
make some changes.
public T allocate(T : Object, A...)(auto ref A arguments) {
auto pMemory = rawAllocate(__traits(classInstanceSize, T),
T.alignof);
assert(pMemory !is null, "Not enought memory on the allocator");
byte[] * pByteMemory = cast(byte[] *) pMemory;
*pByteMemory = typeid(T).init[];
auto pObject = cast(T) pMemory;
static if (is(typeof(pObject.__ctor(arguments))))
{
pObject.__ctor(arguments);
}
return pObject;
}
That would work.
More information about the Digitalmars-d-learn
mailing list