Virtual templates members

JS js.mdnq at gmail.com
Thu Aug 8 09:58:35 PDT 2013


On Thursday, 8 August 2013 at 07:21:19 UTC, Nicolas Sicard wrote:
> On Thursday, 8 August 2013 at 01:48:49 UTC, JS wrote:
>> The following code is used to reduce dependence on new and the 
>> GC. iNew is used as the replacement.
>>
>> The problem is, where ever New is used, it requires typing the 
>> type twice.
>>
>> e.g.,
>>
>> A.New!A(...)
>>
>> instead of A.New(...)
>>
>> Is there any way to solve this issue?
>>
>> (iNew is suppose to provide the contract to implement a "new" 
>> like method that will allocate the class. Note there is no 
>> virtual function so no overhead)
>>
>>
>> import std.stdio, std.conv;
>>
>> enum eNew
>> {
>> 	Default = 0,
>> }
>>
>> interface iNew
>> {
>>
>> 	final static T New(T, A...)(A args)
>> 	{
>> 		eNew type = eNew.Default;
>> 		static if (A.length == 0 || !is(typeof(args[0]) == eNew))
>> 			alias nargs = args;
>> 		else
>> 		{
>> 			type = cast(eNew)args[0];
>> 			alias nargs = args[1..$];
>> 		}
>>
>> 		writeln(">> ",  __traits(classInstanceSize, T));
>>
>> 		switch (type)
>> 		{	
>> 			default: return new T(nargs);
>> 		}
>> 		
>> 		return new T(nargs);
>> 	}
>> }
>>
>> class A : iNew
>> {
>> 	int t;
>> }
>>
>> class B : A
>> {
>> 	int q;
>>    double d;
>> }
>>
>> void main()
>> {
>> 	A a = A.New!A();
>> 	B b = B.New!B();
>> 	readln();
>> }
>
> Why not make it a mixin template?
> ---
> import std.stdio, std.conv;
>
> enum eNew
> {
> 	Default = 0,
> }
>
> mixin template iNew(T)
> {
> 	final static T New(A...)(A args)
> 	{
> 		eNew type = eNew.Default;
> 		static if (A.length == 0 || !is(typeof(args[0]) == eNew))
> 			alias nargs = args;
> 		else
> 		{
> 			type = cast(eNew)args[0];
> 			alias nargs = args[1..$];
> 		}
> 		
> 		writeln(">> ",  __traits(classInstanceSize, T));
> 		
> 		switch (type)
> 		{	
> 			default: return new T(nargs);
> 		}
> 		
> 		//return new T(nargs);
> 	}
> }
>
> class A
> {
> 	mixin iNew!A;
> 	int t;
> }
>
> class B : A
> {
> 	mixin iNew!B;
> 	int q;
> 	double d;
> }
>
> void main()
> {
> 	A a = A.New();
> 	B b = B.New();
> 	readln();
> }
> ---

Because I don't want to have to specify this in each class. iNew 
is suppose to be a contract. What happens if someone writes a 
class and forgets to add the mixin then distributes the class in 
a library? There's no issue with that using an interface because 
it results in an error.


More information about the Digitalmars-d-learn mailing list