Templated Enums?

Era Scarecrow rtcvb32 at yahoo.com
Wed Jun 6 12:01:21 PDT 2012


  I've come across an interesting problem. You can template quite 
a few items, but not enums? Some thoughts from the experts would 
likely be nice. Consider...

enum(T) X{ //syntax error
     bitsPerT = T.sizeof * 8,
     //further calculation types can follow
}

assert(X!(byte).bitsPerT == 8);

The compile complains outright you can't do this, but enclosing 
it in a struct makes that problem go away with the same results.

struct(T) X {
     enum {
         bitsPerT = T.sizeof * 8,
     }
}

assert(X!(byte).bitsPerT == 8); //compiles and works

Now obviously X!(byte).bitsPerT is a mouthful, and although alias 
can condense the code, using different inner members require 
unique names, With does a simpler job in a smaller more compact 
scope.

alias X!(byte) bitsPerByte; //unique name unless small scope

assert(bitsPerByte == 8);

with(X!(int)) {
   assert(bitsPerT == 32);
}

  Unfortunately properties (static functions) don't work with this.

struct(T) X {
     @property static T plusOne(T i) {return i + 1;}
}

with(X!int) {
     int x;
     writeln(x.plusOne);  //error: plusOne function/template not 
defined...
     writeln(plusOne(x)); //works
}


More information about the Digitalmars-d-learn mailing list