declarations as template parameters

Daniel N via Digitalmars-d digitalmars-d at puremagic.com
Sun Aug 30 09:31:16 PDT 2015


Frequently when trying to implement missing language-features in 
the library, it grinds to a halt because it's not possible to 
send declarations as template parameters.

i.e. ex!(int i);

Phobos solved this in a for me very undesirable way, ex:
   mixin(bitfields!(uint, "x", 1));
It no longer looks like a D-style declaration.

The obvious alternative is using strings and while I personally 
actually prefer that to the multiple parameters approach, I know 
a number of people who are vocally opposed to forcing library 
end-users to deal with string-based api:s and they do have a 
point, if only there was a better alternative?

ex!(int, "i"); // oh ze horror!
ex!q{int i};   // at least it now looks like a declaration again.

In before someone says: "Bikeshedding!"

Yes, it's just a few chars, but there's also a bigger difference, 
type-safety, good error messages and you don't really want to 
start parsing 'D' for something this trivial, every-time there is 
a new feature you have to update your little parser, etc. Well, I 
guess you could mixin the string as a declaration and then 
reflect over it... maybe it's the best way, didn't try that 
approach yet.

I did come up with a new(?) way though... as all the other 
methods above, it has it's ups and downs... but I didn't see any 
code in the wild using this method before, so I thought I'd share 
it.

struct Struct
{
   mixin restricted!((uint Size) => 777); // look ma, no strings!
   mixin restricted!(uint Size = 777);    // not working, "ideal 
version"
}

A more complete motivating example at asm.dlang.org(just a quick 
hack not production ready):
http://goo.gl/RSziKx

I guess it could be possible to solve using UDA:s instead... 
maybe I'll try that next, just checking if I'm the only one 
dreaming about "declarations as template parameters".




More information about the Digitalmars-d mailing list