On Saturday, November 26, 2016 00:43:04 Artur Skawina via Digitalmars-d- learn wrote: > IOW you want to improve IFTI, so that `n` is inferred from the > length of the passed argument. That would indeed work for array > literals and CTFE-able expressions. Any improvement to IFTI is a > good thing, but the RT cost of this helper could be high if it ever > doesn't get inlined and completely optimized away.
That's what pragma(inline, true) is for. And if someone wants a different solution that's completely compile-time and doesn't work with variables, then fine. I'm talking about adding something to the standard library, and for that, I think that a solution that is as close as possible to being identical to simply declaring the static array with the length is what would be appropriate. > If the cost isn't an issue and a different syntax is acceptable > then this should already work: > > template staticArray(T, E...) { > T[E.length] staticArray() @property { return [E]; } > } > template staticArray(E...) { > typeof([E][0])[E.length] staticArray() @property { return [E]; } > } > > ubyte a; > auto sa = staticArray!(ubyte, 1, 2, 3, 4, a); > auto sb = staticArray!(1, 2, 3, 4, a); I'm not married to the syntax. I tried that syntax, but I couldn't figure out how to get it to work with runtime values. The closest that I could come up with was what I showed before, and the fact that IFTI wasn't smart enough with VRP was the only blocker. It looks like you've found a way to do it with all template arguments though, which is fine with me. - Jonathan M Davis