Rather neat way of doing multiple return values
Davidl at 126.com
Davidl at 126.com
Sat Mar 17 10:09:34 PDT 2007
Nice implementation!!!
i am thinking about how to get rid of those temp object pointers.
> Here's a (imnsho) rather neat implementation of multiple return values
> from functions.
>
>
> import std.stdio;
>
> template tuple(T...) { alias T tuple; } // basics
>
> template ptr(T...) { // the typetuple ptr!(T) consists of pointers to
> the types in T
> static if (T.length>1) alias tuple!(T[0]*, ptr!(T[1..$])) ptr;
> else alias T[0]* ptr;
> }
>
> struct multival(T...) { /// Simple holder for multiple values
> tuple!(T) v=void;
> static multival!(T) opCall(T t) { multival!(T) res=void; foreach (i,
> e; t) res.v[i]=e; return res; }
> }
>
> struct ptrlist(T...) { /// List of pointers to variables
> tuple!(ptr!(T)) v=void;
> static ptrlist!(T) opCall(inout T t) {
> ptrlist!(T) res=void;
> foreach (i, e; t) res.v[i]=&t[i]; // Ignore e because I can't make
> it inout anyway.
> return res;
> }
> void opAssign(multival!(T) res) {
> foreach (i, e; res.v) *v[i]=e;
> }
> }
>
> multival!(int, float) test() { return typeof(test())(2, 3.0); }
>
> ptrlist!(T) list(T...)(inout T v) { return ptrlist!(T)(v); }
>
> void main() {
> int e=4;
> float f=5;
> list(e, f)=test;
> writefln(e, ", ", f); // 2, 3
> }
>
> Have fun! :D
More information about the Digitalmars-d
mailing list