On Monday, 27 February 2017 at 02:02:57 UTC, ag0aep6g wrote:
Make a range or an array of function pointers from the AliasSeq of function aliases:

----
import std.meta: staticMap;
import std.range: only;

enum fptr(alias f) = &f;
enum fptrs = staticMap!(fptr, funcs);
auto r = only(fptrs);

foreach (i, f; parallel(r))
    values[i] = f(val);
----

Although this answers my question perfectly, it turns out that I have simplified my case too much. It looks like existing overloads are complicating the matter. (I am actually trying to parallelise https://github.com/PhilippeSigaud/Pegged/blob/master/pegged/peg.d#L1646.)

The problem seems to be
enum fptr(alias f) = &f;
(This is still a bit magical to me: it this a shorthand for a template?)

Can the following be made to work?

int one(int) {return 1;}
int two(int) {return 2;}
int three(int) {return 3;}
int four(int) {return 4;}
int five(int) {return 5;}
int six(int) {return 6;}
int seven(int) {return 7;}
int eight(int) {return 8;}

int one(string) {return 0;} // How to ignore this?

int[8] values;

template eval_all(funcs...)
{
    void eval_all(int val)
    {
        import std.meta: staticMap, Filter;
        import std.range: only;
        import std.parallelism;
        import std.traits;

        alias int function(int) iwant;
//enum fptr(alias f) = &f; // Error: cannot infer type from // overloaded function symbol & one
        enum fptr(alias int f(int)) = &f;   // ditto.
        enum fptrs = staticMap!(fptr, funcs);
        auto r = only(fptrs);

        foreach (i, f; parallel(r))
            values[i] = f(val);
    }
}

void main()
{
    eval_all!(one, two, three, four, five, six, seven, eight)(42);
    foreach(i, val; values)
        assert(val == i + 1);
}

Reply via email to