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

Reply via email to