Handy templates

Simen kjaeraas simen.kjaras at gmail.com
Mon Jun 7 16:58:31 PDT 2010


Simen kjaeraas <simen.kjaras at gmail.com> wrote:

Another few that showed up now with my work on combinatorial products of  
ranges:

/**
Determines whether a template parameter is a type of value (alias).

Example:

----
template foo( T... ) if (allSatisfy!( isAlias, T ) {...}
----
*/
template isAlias( alias T ) {
     enum isAlias = true;
}

template isAlias( T ) {
     enum isAlias = false;
}


/**
Switches between template instantiations depending on the parameters  
passed.

Example:

----
alias staticSwitch( foo, 1, 2, 3 ).With callFoo;
callFoo( 2 ); // Actually calls foo!(2)( )
----
*/
template staticSwitch( alias F, T... ) if ( allSatisfy!( isAlias, T ) ) {
     auto With( CommonType!T index, ParameterTypeTuple!( F!( T[0] ) ) args  
) {
         switch ( index ) {
             foreach ( i, e; T ) {
                 mixin( Format!( q{case %s:}, e ) );
                 return F!( e )( args );
                 break;
             }
         }
         assert( false );
     }
}

version( unittest ) {
     int foo( int n ) {
         return n;
     }
}

unittest {
     assert( staticSwitch!( foo, 1, 2 ).With( 2 ) == 2 );
}

The latter does currently not work, due to bug 4292, but a patch has been  
submitted. Granted, a simple template would work around that problem, but  
better to remove it at the root.

Philippe, if you or anyone else want to add any of these templates to your  
dranges or their own collection of templates, I would be pleased to allow  
it. But please do give credit.

-- 
Simen


More information about the Digitalmars-d-learn mailing list