www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Help with specific template function

reply Vladimirs Nordholm <v vladde.net> writes:
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
Mar 25 2018
parent reply Vladimirs Nordholm <v vladde.net> writes:
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) { // ... }
Mar 25 2018
parent reply aliak <something something.com> writes:
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
Mar 25 2018
parent reply Vladimirs Nordholm <v vladde.net> writes:
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?
Mar 25 2018
next sibling parent rumbu <rumbu rumbu.ro> writes:
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
Mar 25 2018
prev sibling parent reply arturg <var.spool.mail700 gmail.com> writes:
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
Mar 25 2018
parent Vladimirs Nordholm <v vladde.net> writes:
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!
Mar 26 2018