Function Templates and Overloading
leoandru
leoandru_member at pathlink.com
Mon Jul 3 18:35:06 PDT 2006
In article <e8cejq$85c$1 at digitaldaemon.com>, Tom S says...
>
>leoandru wrote:
>> correction: I'm using dmd 0.161 not 0.61 as stated.
>>
>> was reading on template specialization
>> http://www.digitalmars.com/d/template.html but the solution seem too cumbersome
>> for what I'm trying to do, which is to have a few function templates that
>> behaves just like their overloaded non-template counterparts. can that be done?
>
>It can't be done in the obvious way... You might try something like this...
>
>
>import std.stdio;
>
>
>void main()
>{
> Foo!(int) foo = new Foo!(int)(1,2,3,4,5,6,7);
>
> sort(foo); //sort natural ordering
> sort(foo, (int a, int b) { return -(a - b); } ); //sort reverse order
>}
>
>class Foo (T)
>{
> alias T myT;
> this(T[] args ...)
> {
> }
>}
>
>
>template sortT(T) {
> void sortT (Foo!(T) foo)
> {
> // ...
> }
>
>
> void sortT (Foo!(T) foo, int delegate(T a, T b) compare)
> {
> // ...
> }
>
>
> void sortT (Foo!(T) foo, int function(T a, T b) compare)
> {
> // ...
> }
>}
>
>
>void sort(T, X=void*)(T foo, X compare = null) {
> static assert (is(T : Foo!(T.myT)));
>
> static if (!is(X == void*)) {
> return sortT!(T.myT).sortT(foo, compare);
> } else {
> return sortT!(T.myT).sortT(foo);
> }
>}
>
>
>... or a variation of it. The IsExpression can be invaluable at times
>and I'm sure you can make the above code look nicer. Mine's just a quick
>hack ;)
>
>
>--
>Tomasz Stachowiak /+ a.k.a. h3r3tic +/
cool.. thanks. :)
I will work with this. It would be nice if it worked the obvious way though.
Thanks again.
More information about the Digitalmars-d-learn
mailing list