This is getting kind of a long example, but I'm really only interested in the last 4 or 5 lines. This works as desired, creating the array of tuples, but I'm wondering if there is a way to have the Tuple array defined as auto instead of having to specify the types. I tried using .array() at the end of the last samples.each!, but couldn't find an implementation that worked.

Yes, I know, some of these imports aren't required (yet).

import std.stdio;
import std.algorithm;
import std.conv;
import std.range;
import std.typecons;
import std.parallelism;
import std.array;

struct S { ulong a; ulong b; ulong c; ulong d; double e; ulong f;}
ulong f1(ref S s) { with(s){return a+b;}}
double f2(ref S s) { with(s){return (c+d)/e;}}
double f3(ref S s) { with(s){return (c+f)/e;}}

int main()
{

        S[10] samples;
        // initialize some values
        foreach ( int i, ref s; samples){
                int j=i+1;
                with (s){
                        a=j; b=j*2; c=j*3; d=j*4; e=j*10; f=j*5;
                }
        }

        // apply several functions on each  sample
samples.each!((int i, ref a)=>tuple!("sample","f1","f2","f3")(i,f1(a),f2(a),f3(a)).writeln());

        // output the function results to an array of tuples
        Tuple!(int, ulong, double, double)[] arr;

samples.each!((int i, ref a)=> arr ~= tuple!("sample","f1","f2","f3")(i,f1(a),f2(a),f3(a)));
        writeln(arr);
        return 0;
}

Reply via email to