Sergei Nosov:

T identity(T)(T e) { return e; }
struct S(alias Func)
{
    void call()
    {
        import std.stdio;
        writeln(Func("string").length);
    }
}
static struct S1
{
    alias S!(identity) A1;
    //alias S!(x => x) A2;
    alias S!(function string (string e) { return e; }) A3;
}
void main()
{
    S1.A1.init.call();
    S1.A3.init.call();
}

The main complaint is that function literal is somehow broken in that case. The output of the program is
6
4527264
For some reason, length in the second case is wrong.

Global structs don't need the "static" attribute.

This version of your code gives the output 6 6 on Windows 32 bit:


import std.stdio;

T identity(T)(T e) { return e; }

struct S(alias Func) {
    void call() {
        Func("string").length.writeln;
    }
}

struct S1 {
    alias A1 = S!identity;
    //alias A2 = S!(x => x);
    alias A3 = S!(function string(string s) => s);
}

void main() {
    S1.A1.init.call;
    S1.A3.init.call;
}


I don't know why in A2 it infers a delegate.

Bye,
bearophile

Reply via email to