On Sunday, 12 December 2021 at 03:02:28 UTC, apz28 wrote:
On Sunday, 12 December 2021 at 00:02:25 UTC, Stanislav Blinov wrote:
@apz28, I can't figure out the intent here. To convert result of abs to an unsigned?

The function logic works only for unsigned type and the parameter value can be altered in body hence Unqual. If not Unqual, must declare a local var and make a copy. Just asking if this can be done to avoid a cast by caller

AFAIK stuff like `const int` implicitly converts to `int` since `int` is passed by value so the `const`ness of the original value is not violated.

That's why code like:
```d
void main(){
        const int a = 55;
        int b = a;
}
```
compiles and executes.


So, in a similar vein, your code will transform to:

```d
void foo1(ubyte x) {}
void foo1(ushort x) {}
void foo1(uint x) {}
void foo1(ulong x) {}

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
        foo3(x);
}


void foo3(ulong param){ //I'm assuming this is your function that you will pass your uint to
        writeln(param);
}

void main()
{
    import std.math;

int s = int.min + 1; //abs returns int.min for abs(int.min) lol XD
    foo1(abs(s));
    foo2(abs(s)); //failed? //Not anymore :D
}
```

Again, please remember that `std.math.algebraic:abs` doesn't return `uint` for `int` and so on, please see [the documentation](https://dlang.org/phobos/std_math_algebraic.html#.abs):

Returns:
The absolute value of the number. If floating-point or integral, the __return type__ will be the __same as the input__.


Limitations
Does not work correctly for signed intergal types and value Num.min.

Reply via email to