Metaprogramming work around

Dmitry Olshansky dmitry.olsh at gmail.com
Tue Apr 17 03:46:07 PDT 2012


On 17.04.2012 12:28, "Erèbe" wrote:
> Hi,
>
> I'm working on some metaprogramming code which implement a Factory and
> generate an enum from a list of string.
>
> So here my questions :
>
> 1) The documentation say mixin templates could take as
> TemplateParameterList
> a "TemplateParameter , TemplateParameterList" but all my tried to
> instaciate this template failed lamentably.
>
> mixin template Foo(T, R...)
> {
>
> anotherTemplate!(T);
> Foo!(R);
>
> }
>
> mixin Foo!( string, string, string);
>
> Is something wrong with variadic template and mixin, do i miss something ?
>
>
> 2) Below some code I writed and I wanted to know if you have some advice
> to improve it (Right maner to do it, TypeChecking, Safety, ...) <-
> variaidc arguments
>
>
> The code is working is purpose is to create an enum of commands and to
> create a factory which returns me the command associated to a string.
>
> Thanks !
>
> ===========================Code============================================
> import std.stdio;
> import std.traits;
> import std.conv;
>
>
> //Use to create the enums of every commands
> mixin template enumGenerator( T... )
> {
>
> template generate( T... )
> {
> enum string value = T[0] ~ ", " ~ generate!( T[2..$] ).value;
> }
>
> template generate() { enum string value = "UNKNOW"; }
>
>
> //Here the creation of the enum
> mixin("enum Command { " ~ generate!(T).value ~ "};");
>
> }
>
> //Generate a function which return a command in regard of a string
> mixin template factoryGenerator( T... )
> {
> template generate( T... )
> {
> enum string value = "if( cmd == \"" ~ T[1] ~ "\")"
> ~ "return Command." ~ T[0] ~ ";"
> ~ "else "
> ~ generate!(T[2..$]).value;

Stick in the magic pragma(msg, value); in here you won't regret it ;)

> }

Another important thing to note here is that you should really 
reconsider using plain if/else if it's a production code not some toy to 
learn meta programming.
At very least try to generate switch over strings but I don't think any 
D compiler optimizes it. (but it should in future)
Real world options are binary search on string table or even better 
built-in hash table.


-- 
Dmitry Olshansky


More information about the Digitalmars-d-learn mailing list