On 10/19/2012 06:38 AM, Oleg wrote:
> Problem solved partially.
>
> http://dpaste.dzfl.pl/e7871a01
>
> in structs I use fix length arrays declarations, and alias its to
> structs, but not allowed casting to fix length arrays.
> I want check array length in compile time
>
> auto opBinary(string op,E)( E[DLen] b ) // fix length array

E[DLen] is good above. You can also consider taking by 'const ref' if DLen is too large. Otherwise, being value-types, fixed-length arrays normally get copied to functions.

> if( ( op == "+" || op == "-" ) && is( E : T ) )
> {
> // without this checking in runtime
> //if( DLen != b.length )
> // throw new Exception("bad length");

Yes, that is not needed anymore because now it is known that b.length is always DLen.

> auto res = VecT(this);
> foreach( i, ref m; mixin( "res." ~ DName ) )
> mixin( "m " ~ op ~ "= b[i];" );
> return res;
> }
>
> if I write E[DLen] I have errors like this
>
> Error: template
> opop.vec!("xyz").vec.arrayMath!("data",3LU,double,vec!("xyz")).opAssign
> does not match any function template declaration
>
> Error: template
> opop.vec!("xyz").vec.arrayMath!("data",3LU,double,vec!("xyz")).opAssign(E)
> if (is(E : T)) cannot deduce template function from argument types
> !()(int[])

The problem is that array literals are slices, not fixed-length arrays.

    pragma(msg, typeof([1,2,3]));

prints

int[]

> but declaration like this allowed
> int[4] f = [1,2,3,4];

Because in that case the type of f is explicitly int[4]. The following would not be:

auto f = [1,2,3];

The type of f is int[].

Of course it is possible to support both arrays and slices, and avoid the check by something like isStaticArray, but your callers will have to be aware of the fact that array literals are slices.

Ali

Reply via email to