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