Constant template arguments

bearophile via Digitalmars-d digitalmars-d at puremagic.com
Sat Jan 3 07:19:59 PST 2015


Meta:

> Wouldn't it be better to do this at the call site anyway? Just 
> use a simple function.
>
> Unqual!T unconst(T)(T val)
> if (isScalarType!T)
> {
>     return val;
> }
>
> void foo(T)(T a, T b)
> {
>     a = b;
>     b = a;
> }
>
> void main()
> {
>     const int x, y;
>     foo(x.unconst, y.unconst);
> }

That's an option. Currently Phobos doesn't use that strategy, but 
adds a recursive call, like in std.numeric.gcd:


T gcd(T)(T a, T b) {
     static if (is(T == const) || is(T == immutable)) {
         return gcd!(Unqual!T)(a, b);
     } else {
         static if (T.min < 0) {
             //enforce(a >= 0 && b >=0);
             assert(a >= 0 && b >=0);
         } while (b) {
             auto t = b;
             b = a % b;
             a = t;
         }
         return a;
     }
}


I don't know what's better, but regular functions are able to 
"strip away" the const/immutable of their input values, so 
perhaps we should have a mean to do the same with template 
functions (and not at the call site) without the need of 
recursive calls like that one and without creating mutable local 
values like this:

Unqual!T mutableA = a, mutableB = b;

Bye,
bearophile


More information about the Digitalmars-d mailing list