Static arrays, typeof and IFTI?
kennytm
kennytm at gmail.com
Sun Oct 9 23:57:47 PDT 2011
Norbert Nemec <Norbert at Nemec-online.de> wrote:
> Hi there,
>
> after a very busy and eventful year in my personal life, I have now
> finally found some time to play with D2. I am very impressed by the
> progress!
>
> One thing I noticed was that static arrays are somehow strangely limited:
>
> It is possible to overload based on the length:
>
> --------
> void f(int[3] x) {
> writeln("int[3]: ",x);
> }
>
> void f(int[4] x) {
> writeln("int[4]: ",x);
> }
>
> int main(string argv[]) {
> f([1,2,3]);
> f([1,2,3,4]);
> return 0;
> }
> --------
>
> However, used as function template argument, a static array is casted to
> a dynamic array:
>
> -----------
> void g(T)(T x) {
> static assert (__traits(isStaticArray,T));
> enum N = T.init.length;
> writeln(N,": ",x);
> }
>
> int main(string argv[]) {
> g([1,2,3]);
> return 0;
> }
> ------------
>
> gives the error message:
>
> | Error: static assert (__traits(isStaticArray,int[])) is false
> | instantiated from here: g!(int[])
>
> Without the assertion, N is defined to 0.
>
> Further investigation shows:
>
> -------
> g!(int[3])([1,2,3]); // passes a static array
> -------
> int[3] x3 = [1,2,3];
> g(x3); // passes a static array
> -------
> auto z3 = [1,2,3]; // defines z3 as dynamic array
> g(y3); // passes a dynamic array
> -------
>
> So it seems, the problem is that array literals on their own turned into
> dynamic arrays unless you explicitly state a static array type in some way.
>
> Wouldn't it make more sense the other way around? After all, turning a
> static array into a dynamic array is easy, the other way around is
> prohibited by the compiler. If array literals simply had a static array
> type, they could be implicitly casted to dynamic arrays when necessary
> but stay static if possible.
>
> Greetings,
> Norbert
I think you could use something like
void f(T, size_t n)(T[n] param) { ... }
(not tested)
More information about the Digitalmars-d
mailing list