On Sunday, 14 January 2018 at 00:09:42 UTC, kdevel wrote:
fusp.d
```
import std.stdio;
import std.typecons;

void foo (T) ()
{
   writeln ("(1) foo T = ", T.stringof);
}

void foo (T : float) ()
{
   writeln ("(2) foo T = ", T.stringof);
}

// void foo (T : double) ()
// {
//    writeln ("(2) foo T = ", T.stringof);
// }

void main ()
{
   foo!float;
   foo!double;
   foo!real;
   foo!string;
}
```

prints

   (2) foo T = float
   (2) foo T = double
   (2) foo T = real
   (1) foo T = string

I would have expected

   (2) foo T = float
   (1) foo T = double
   (1) foo T = real
   (1) foo T = string

The compiler does not allow me to specialize the primary function template for double:

The `:` is not a type equality check. It is more like a "converts to" or "is of the form of". i.e. `void foo (T : float) ()` reads as "foo is a template function returning void, taking one template type T that converts to float, and no runtime args."

The usual way to do what you are trying to do is with template constraints.

void foo(T)() if (is(T== float)) { ...}

Reply via email to