Need help to compile code with traits
Xavier Bigand via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Feb 5 06:59:04 PST 2017
Hi,
I am trying to create an allocator that don't use the GC, and I have
issues for the initialization of member before calling the constructor.
Here is my actual code :
> mixin template NogcAllocator(T)
> {
> static T nogcNew(T, Args...)(Args args) @nogc
> {
> import core.stdc.stdlib : malloc;
> import std.traits;
>
> T instance;
>
> instance = cast(T)malloc(__traits(classInstanceSize, T));
> foreach (string member; __traits(allMembers, T))
> {
> static if (isType!(__traits(getMember, T, member)))
> __traits(getMember, instance, member) = typeof(__traits(getMember, T, member)).init;
> }
>
> instance.__ctor(args);
> return instance;
> }
>
> static void nogcDelete(T)(T instance) @nogc
> {
> import core.stdc.stdlib : free;
>
> instance.__dtor();
> free(instance);
> }
> }
>
> unittest
> {
> struct Dummy {
> int field1 = 10;
> int field2 = 11;
> }
>
> class MyClass {
> mixin NogcAllocator!MyClass;
>
> int a = 0;
> int[] b = [1, 2, 3];
> Dummy c = Dummy(4, 5);
>
> int d = 6;
>
> this() @nogc {
> }
>
> this(int val) @nogc {
> d = val;
> }
> }
>
> MyClass first = MyClass.nogcNew!MyClass();
> MyClass second = MyClass.nogcNew!MyClass(7);
>
> assert(first.a == 0);
> assert(first.b == [1, 2, 3]);
> assert(first.c.field1 == 4);
> assert(first.d == 6);
>
> assert(second.c.field1 == 4);
> assert(second.d == 7);
> }
And the compilation errors :
> ..\src\core\nogc_memory.d(16): Error: no property 'this' for type 'core.nogc_memory.__unittestL39_3.MyClass'
> ..\src\core\nogc_memory.d(17): Error: type Monitor is not an expression
> ..\src\core\nogc_memory.d(63): Error: template instance core.nogc_memory.__unittestL39_3.MyClass.NogcAllocator!(MyClass).nogcNew!(MyClass) error instantiating
> ..\src\core\nogc_memory.d(16): Error: no property 'this' for type 'core.nogc_memory.__unittestL39_3.MyClass'
> ..\src\core\nogc_memory.d(17): Error: type Monitor is not an expression
> ..\src\core\nogc_memory.d(64): Error: template instance core.nogc_memory.__unittestL39_3.MyClass.NogcAllocator!(MyClass).nogcNew!(MyClass, int) error instantiating
I don't understand my mistake with the getMember and isType traits.
And I am curious about of what is the Monitor.
More information about the Digitalmars-d-learn
mailing list