On Monday, 8 April 2019 at 12:23:28 UTC, Ron Tarrant wrote:

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?



You should have read further along in that chapter :-) I evolve the MyTemplate example through the end of that "Templates as code blocks" section to this:

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

And show that it must be instantiated like this:

void main() {
  MyTemplate!int.ValWrapper vw1;
  MyTemplate!int.ValWrapper vw2;
  vw1.val = 20;
  vw2.val = 30;
  vw1.printVal();
  vw2.printVal();
}

And in the next section, "Struct and class templates", I introduce the concept of eponymous templates by rewriting MyTemplate like so:

template ValWrapper(T) {
  struct ValWrapper {
    T val;
    void printVal() {
      writeln("The type is ", typeid(T));
      writeln("The value is ", val);
    }
  }
}

And show that it can be instantiated with the shorthand:

ValWrapper!int vw;

And that the template can be refactored to this (since it's eponymous):

struct ValWrapper(T) {
  T val;
  void printVal() {
    writeln("The type is ", typeid(T));
    writeln("The value is ", val);
  }
}

In the subsequent sections, I show both long and short (eponymous) forms of enum and function templates.



Reply via email to