Thread overview
Help with specific template function
Mar 25, 2018
Vladimirs Nordholm
Mar 25, 2018
Vladimirs Nordholm
Mar 25, 2018
aliak
Mar 26, 2018
Vladimirs Nordholm
Mar 26, 2018
rumbu
Mar 26, 2018
arturg
Mar 26, 2018
Vladimirs Nordholm
March 25, 2018
Hello Dlang community!

I need help in creating a template function which would look like the following pseudo-code:

    void foo(<a number>, <also a number>, <required arg>, <optional arg>...);
    // would be used as `void foo(x, y, arg1, arg2, ..., argN)`

    // valid examples:
    foo(5.332, 1, "a string", 123, "42");
    foo(3, 44, false);

    // invalid examples:
    foo(1, 1);
    foo(3, "stringers", "arg");

The underlying problems are:
* How do I ensure the two first arguments (used as coordinates) are types of numbers (all kinds: ints, floats, reals, etc.)
* At least one argument is passed after the coordinates

Best regards,
Vladimris Nordholm
March 25, 2018
On Sunday, 25 March 2018 at 18:24:37 UTC, Vladimirs Nordholm wrote:
> The underlying problems are:
> * How do I ensure the two first arguments (used as coordinates) are types of numbers (all kinds: ints, floats, reals, etc.)
> * At least one argument is passed after the coordinates

I found a solution which satisfies my needs :)

    void foo(X, Y, Args...)(X x, Y y, Args args)
    if (__traits(isArithmetic, x) && __traits(isArithmetic, y) && args.length >= 1)
    {
        // ...
    }
March 25, 2018
On Sunday, 25 March 2018 at 19:06:14 UTC, Vladimirs Nordholm wrote:
> On Sunday, 25 March 2018 at 18:24:37 UTC, Vladimirs Nordholm wrote:
>> The underlying problems are:
>> * How do I ensure the two first arguments (used as coordinates) are types of numbers (all kinds: ints, floats, reals, etc.)
>> * At least one argument is passed after the coordinates
>
> I found a solution which satisfies my needs :)
>
>     void foo(X, Y, Args...)(X x, Y y, Args args)
>     if (__traits(isArithmetic, x) && __traits(isArithmetic, y) && args.length >= 1)
>     {
>         // ...
>     }

FYI there's also https://dlang.org/library/std/traits/is_numeric.html incase you haven't see it -takes in to account bools and chars, which depending on your usecase you may not want to count as arithmetic.

Cheers
- Ali
March 26, 2018
On Sunday, 25 March 2018 at 21:31:16 UTC, aliak wrote:
> On Sunday, 25 March 2018 at 19:06:14 UTC, Vladimirs Nordholm wrote:
>> On Sunday, 25 March 2018 at 18:24:37 UTC, Vladimirs Nordholm wrote:
>>> The underlying problems are:
>>> * How do I ensure the two first arguments (used as coordinates) are types of numbers (all kinds: ints, floats, reals, etc.)
>>> * At least one argument is passed after the coordinates
>>
>> I found a solution which satisfies my needs :)
>>
>>     void foo(X, Y, Args...)(X x, Y y, Args args)
>>     if (__traits(isArithmetic, x) && __traits(isArithmetic, y) && args.length >= 1)
>>     {
>>         // ...
>>     }
>
> FYI there's also https://dlang.org/library/std/traits/is_numeric.html incase you haven't see it -takes in to account bools and chars, which depending on your usecase you may not want to count as arithmetic.
>
> Cheers
> - Ali

Thanks Ali, I had not thought about chars, bools, etc.

However I do not understand how to use that with my arguments. Eg. I would expect to do something like:

    void foo(X, Y, Args...)(X x, Y y, Args args)
    if(isNumeric!(x) && isNumeric!(y) && args.length >= 1)
    {
        // ...
    }

gives the error

    template instance isNumeric!(x) does not match template declaration isNumeric(T)

How would I resolve this issue?
March 26, 2018
On Monday, 26 March 2018 at 06:40:34 UTC, Vladimirs Nordholm wrote:

>
> However I do not understand how to use that with my arguments. Eg. I would expect to do something like:
>
>     void foo(X, Y, Args...)(X x, Y y, Args args)
>     if(isNumeric!(x) && isNumeric!(y) && args.length >= 1)
>     {
>         // ...
>     }
>
> gives the error
>
>     template instance isNumeric!(x) does not match template declaration isNumeric(T)
>
> How would I resolve this issue?


isNumeric applies to a type, not to a variable => IsNumeric!X
March 26, 2018
On Monday, 26 March 2018 at 06:40:34 UTC, Vladimirs Nordholm wrote:
> How would I resolve this issue?

use the type not the variables:
isNumeric!X && isNumeric!Y
March 26, 2018
On Monday, 26 March 2018 at 06:48:45 UTC, rumbu wrote:
> isNumeric applies to a type, not to a variable => IsNumeric!X

On Monday, 26 March 2018 at 06:51:48 UTC, arturg wrote:
> use the type not the variables:
> isNumeric!X && isNumeric!Y

Ah, missed that. Thanks a bunch!