Why code failed to compile for foo2?

Tejas notrealemail at gmail.com
Wed Dec 15 01:47:17 UTC 2021


On Tuesday, 14 December 2021 at 13:25:04 UTC, apz28 wrote:
> On Tuesday, 14 December 2021 at 05:04:46 UTC, Tejas wrote:
>> Is there anything wrong with the answer I posted?
>>
>> Can you please tell me if there's anything dissatisfactory 
>> about it? I feel like it does everything the OP wants.
>>
>> Also, am I wrong in using `Unconst` over `Unqual`? Isn't 
>> `Unqual` overkill if you just want to cast away `const`?
>
> 1. A template function should behave as to replace 4 overload 
> functions
> There is special logic for parameter type (2 vs 4...)
>
> 2. Your implementation does not remove 'const' as below
> import std.traits : Unconst;
> import std.stdio : writeln;
>
>     void foo2(T)(T x) if(is(Unconst!(T) : ulong)) {//You don't 
> need Unqual for this
>         pragma(msg, T.stringof);
>         writeln(x);
>     }
>
>     void main()
>     {
>         import std.math;
>
>         const int s1 = -3;
>         int s2 = -2;
>         foo2(abs(s1));
>         foo2(abs(s2));
>
>         enum byte b1 = 0;
>         const byte b2;
>         byte b3;
>         foo2(b1);
>         foo2(b2);
>         foo2(b3);
>     }
>     --Output
>     const(int)
>     int
>     byte
>     const(byte)
>     3
>     2
>     0
>     0
>     0

Then I suggest using `inout`, if you're trying to reduce number 
of template instantiations

```d
import std.traits : Unconst;
import std.stdio : writeln;

void foo2(T)(inout(T) x) if(is(Unconst!(T) : ulong)) {//You don't 
need Unqual for this
	pragma(msg, T.stringof);
	writeln(x);
}

void main(){
	import std.math;
	const int ci = -3;
	int i = -2;
	immutable int ii = 24342;
	foo2(abs(ci));
	foo2(abs(i));
	foo2(ii);
	
	byte b = 0;
	const byte cb;
	immutable byte ib;
	foo2(b);
	foo2(cb);
	foo2(ib);
	
	const long cl = 4554;
	long l = 12313;
	immutable long il = 3242343;
	foo2(cl);
	foo2(l);
	foo2(il);
	
}

Output(Compile-time):
int
byte
long

Output(Runtime):
3
2
24342

0
0
0

4554
12313
3242343
```




More information about the Digitalmars-d-learn mailing list