On Friday, 28 November 2014 at 19:45:48 UTC, H. S. Teoh via
Digitalmars-d-learn wrote:

This syntax is a little confusing, but basically the ":" there is saying "this type, when instantiated with the following pattern, produces a
valid type". Essentially it's equivalent to:

        Point!T getResponse(T)(string question)
                if (is(typeof(Point!T))) // i.e., Point!T is a valid type
        {
                ...
        }


Is there a typo here? This version doesn't compile with the
original call:     auto pt = getResponse!(Point!int)("point");


Yes, because D does not support overlapping template overloads.

But I thought the original example has ovelapping templates.
Let's take a simpler example from earlier in the tutorial, where
Point is a non-template struct:


// The general definition of the function template (same as
before)
T getResponse(T)(string question)
{
     writef("%s (%s): ", question, T.stringof);

     T response;
     readf(" %s", &response);

     return response;
}

// The specialization of the function template for Point
T getResponse(T : Point)(string question)
{
     writefln("%s (Point)", question);

     auto x = getResponse!int("  x");
     auto y = getResponse!int("  y");

     return Point(x, y);
}

auto center = getResponse!Point("Where is the center?");

Doesn't getResponse!Point match both declarations?

Reply via email to