Partially instantiating templates?

Simen kjaeraas simen.kjaras at gmail.com
Mon Jan 31 03:55:07 PST 2011


Magnus Lie Hetland <magnus at hetland.org> wrote:

> I'm building a function (or template or whatever, really) that is  
> related to map and minPos in std.algorithm. Basically, it's the standard  
> mathematical argmin, except that it also returns min. It looks something  
> like this:
>
>   auto minArg(alias fun, Range, T)(Range range, out T minVal) {
>       ...
>   }
>
> Already there may be issues -- the return type should be  
> ElementType(range) and T should be the return type of fun ... but it  
> works. (Suggestions on these issues are welcome, but that's not really  
> the main point here.)

ElementType!Range minArg( alias fun, Range )( Range range, out  
ReturnType!fun ) {
     ...
}

Might I also ask why you use an out parameter instead of a tuple return?


> The thing is, because I'm also returning the actual value, I'd rather  
> not use the strategy of std.algorithm.minPos, which asks you to use an  
> inverted function to get maxPos; instead, I'd like an explicit maxArg  
> function. My idea was to have a common, more general optArg, which took  
> an operator ("<" or ">") as a compile-time argument. Then I could do  
> something like
>
>   alias optArg!"<" minArg;
>   alias optArg!">" maxArg;
>
> Then, at some *later* time, I might want to do something like:
>
>   alias maxArg!((v) {return dist(u,v);}) farthest;

D currently does not support template currying to any good degree.

However, there is at least one library out there that does that for you:

http://www.dsource.org/projects/dranges

In the file templates.d, there is the template CurryTemplate, which
rewrites a template to a set of nested templates. This would allow you
to partially instantiate a template, and add more parameters as you go.


> I've been able to make either one of these two pieces of functionality  
> work with some twiddling and nesting (i.e., *either* instantiating  
> optArg into minArg/maxArg, *or* instantiating explicitly defined  
> minArg/maxArg into specialized functions) but combining them has so far  
> eluded me (unless I start fiddling with strinc constants and mixin(),  
> which seems excessively hacky for such a simple thing).

dranges' templates.CurryTemplate should take care of some of your problems.
Not sure if it will fix them all.



-- 
Simen


More information about the Digitalmars-d-learn mailing list