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();
}