On 11/29/2014 12:41 AM, Sly wrote:
Ah, now I see. In C++ we would also need to supply template
parameters, but we'd put them before return type
(template<typename T> getResponse<Point<T>>); in D we put them
before the colon.

Now I'm trying to write a specialization for Pair. It seems that
this is the way to do it:

Pair!(A, B) getResponse(A, B: Pair!(A, B))(string question)
{
      auto a = getResponse!A(" a");
      auto b = getResponse!B(" b");
      return new Pair!(A, B)(a, b);
}

auto pair = getResponse!(Pair!(int, int))("pair?");

But it doesn't work: this call resolves to a general version T
getResponse(T), and I get a compilation error because it tries to
instantiate readf!(Pair*).
What am I doing wrong?

I wish I could formalize these definitions better or consistently but here my "art", which works: :)

Pair!(A, B) getResponse(P : Pair!(A, B), A, B)(string question)
{
    // ...
}

That template parameter reads:

- This template takes a single parameter (P)

- P must match Pair!(A, B)

- Where A and B are both types

So, getting back to Point, now the following is consistent with the above:

Point!T getResponse(P : Point!T, T)(string question)
{
    // ...
}

Now, that means: "This is a specialization for P, where it matches Point!T and T is a type."

Maybe I should change the specialization examples in that chapter...

Ali

Reply via email to