Partially instantiating templates?
Simen kjaeraas
simen.kjaras at gmail.com
Mon Jan 31 09:24:00 PST 2011
Andrej Mitrovic <andrej.mitrovich at gmail.com> wrote:
> On 1/31/11, Simen kjaeraas <simen.kjaras at gmail.com> wrote:
>>
>> module foo;
>>
>> import std.typecons;
>> import std.functional;
>> import std.array;
>>
>> template optArg( alias pred ) {
>> template optArg( alias fn ) {
>> auto optArg( Range )( Range r ) {
>> alias binaryFun!pred predicate;
>> alias unaryFun!fn func;
>>
>> auto result = tuple( r.front, func( r.front ) );
>> foreach ( e; r ) {
>> auto tmp = func( e );
>> if ( predicate( e, result[1] ) ) {
>> result = tuple( e, tmp );
>> }
>> }
>> return result;
>> }
>> }
>> }
>>
>> void main( ) {
>> alias optArg!"a<b" minArg;
>> alias minArg!"a" foo;
>> assert( foo( [5,2,1,3] ) == tuple(1,1) );
>> }
>>
>
> Damn! That's pretty nice, I didn't know we could nest with the
> eponymous trick. This could be quite useful, thanks.
You can only do that using aliases.
--
Simen
More information about the Digitalmars-d-learn
mailing list