Templates - What's Up with the template keyword?

Ron Tarrant rontarrant at gmail.com
Mon Apr 8 12:23:28 UTC 2019


I'm digging into templates in an attempt to understand the 
signals-n-slots replacement for the observer pattern, but I've 
got a question I can't seem to find an answer for and an example 
for which I'm unable to solve the error.

First, the question...

In Michael Parker's book, "Learning D," (Packt, 2015) on page 160 
he gives an example of a basic template:

template MyTemplate(T)
{
    T val;

    void printVal()
    {
       import std.stdio : writeln;
       writeln("The type is ", typeid(T));
       writeln("The value is ", val);
    }
}

But in "Programming in D," (self, 2009-2018) by Ali Çehreli, 
there's no mention of the 'template' keyword in any of his 
examples.

Has the 'template' keyword been deprecated? Or is it optional?


And now, my broken code...

In Ali's book (section 64.7, page 401) this example is given:

Point!T getResponse(T : Point!T)(string question)
{
    writefln("%s (Point!%s)", question, T.stringof);
    auto x = getResponse!T(" x");
    auto y = getResponse!T(" y");
    return Point!T(x, y);
}

But I'm having trouble working out how this would be used. Up to 
this point, either the usage case is given or I was able to work 
it out on my own, but this one seems to demand a use case outside 
the scope of what's been covered in the chapter so far and I'm 
lost.

My full code for this example:

-----------------------------------------
import std.stdio;
import std.math;
import std.string;

struct Point(T)
{
	T x;
	T y;
	
	T distanceTo(Point that) const
	{
		immutable real xDistance = x - that.x;
		immutable real yDistance = y - that.y;
		
		immutable distance = sqrt((xDistance * xDistance) + (yDistance 
* yDistance));
		
		return(cast(T)distance);
		
	} // distanceTo()

} // struct Point


Point!T getResponse(T : Point!T)(string question)
{
	writefln("%s (Point!%s)", question, T.stringof);
	
	auto x = getResponse!T(" x");
	auto y = getResponse!T(" y");
	
	return(Point!T(x, y));
	
} // getResponse() Point!T


void main()
{
	auto wayPoint1 = getResponse!Point("Where is the first map 
location?");
	auto wayPoint2 = getResponse!Point("Where is the second map 
location?");
	
	writeln("Distance: ", wayPoint1.distanceTo(wayPoint2));

} // main()

--------------------------------------
(lines 47 & 48) Error: template instance `getResponse!(Point)` 
does not match template declaration getResponse(T : 
Point!T)(string question)

Any help will be very much appreciated.



More information about the Digitalmars-d-learn mailing list