On Wednesday, 6 January 2021 at 18:34:31 UTC, Nick Treleaven wrote:
On Wednesday, 6 January 2021 at 18:29:05 UTC, Nick Treleaven wrote:
Can be fixed (probably with another name):

//import std.array;

Actually template overloading seems to work fine:

template staticArray(T) {
    T[n] staticArray(ulong n) (auto ref T[n] a) {return a;}
}

T[n] staticArray(T, ulong n) (auto ref T[n] a) {return a;}

void main(){
    auto a = [1,2,3].staticArray!float;
    pragma(msg, typeof(a)); // float[3]
    a.writeln();
    [1,2,3].staticArray.writeln();
}

What about something like below to handle any user-defined type.

import std.stdio: writeln;

template staticArray(T) {
    T[n] staticArray(ulong n) (auto ref T[n] a) {return a;}

    T[n] staticArray(U, ulong n) (auto ref U[n] a)
        if (!is(T == U))
    {
        T[n] output;
        for(size_t i = 0; i < n; i++) {
            output[i] = cast(T) a[i];
        }
        return output;
    }
}

T[n] staticArray(T, ulong n) (auto ref T[n] a) {return a;}

struct Foo {
    float x;
    T opCast(T)() {
        return cast(T) x;
    }
}

void main(){
    auto a = [1,2,3].staticArray!float;
    pragma(msg, typeof(a)); // float[3]
    a.writeln();
    [1,2,3].staticArray.writeln();

    auto b = [1,2,3].staticArray!Foo;
    b.writeln();
}

Reply via email to