No shortcircuit for static if or template constraints?

stewart via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Oct 24 16:34:18 PDT 2015


On Saturday, 24 October 2015 at 23:26:09 UTC, stewart wrote:
> Hi All,
>
> Given this code:
>
> ---
> import std.traits;
> import std.range;
> import std.stdio;
>
> enum isSupportedRange(T) = (isInputRange!T && 
> isIntegral!(ForeachType!T));
>
> void func(T)(T vals)
> {
>     static if(isSupportedRange!T) {
>         // Do something with a range
>     } else {
>         // Do something with a scalar
>     }
> }
>
> void main() {
>     int a1 = 0;
>     int[] a2 = [1,2,3];
>
>     func(a1);
>     func(a2);
> }
> ---
>
> I a compile error like so:
>
> ...std/traits.d(6136): Error: invalid foreach aggregate 0
> hack.d(6): Error: template instance std.traits.ForeachType!int 
> error instantiating
> hack.d(10):        instantiated from here: isSupportedRange!int
> hack.d(22):        instantiated from here: func!int
>
> However, if I remove the Foreach part the "isInputRange!T" 
> clearly fails.
>
> I also tried overloading the function like so:
>
> ---
> enum isSupportedRange(T) = (isInputRange!T && 
> isIntegral!(ForeachType!T));
>
> void func(T)(T vals) if(isSupportedRange!T) {
>         // Do something with a range
> }
> void func(T)(T vals) if(isNumeric!T) {
>     // Do something with a scalar
> }
> ---
>
> Again, if I remove the Foreach part and ignore element type of 
> the range it works OK.
>
> Am I doing something wrong?
>
> Thanks,
> stew


Oh and the workaround I'm using is this:

---
void func(T)(T vals) {
     static if(isInputRange!T) {
         static if(isIntegral!(ForeachType!T)) {
             // Do something with range
         }
     } else {
         // do something with scalar
     }
}
---

which is a bit ugly.




More information about the Digitalmars-d-learn mailing list