Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
March 12, 2013 Variadic function not recognizing static array length | ||||
---|---|---|---|---|
| ||||
void func(string[2] a) {} void func2(T...)(T args) { static assert(is(typeof(args[0]) == string[2])); } void func3(T...)(T args) { static assert(args[0].length == 2); } func(["",""]); // Okay func2(["",""]); // Error: (is(string[] == string[2LU])) is false func3(["",""]); // Error: _param_0 cannot be read at compile time Is this the intended design? Is there a workaround which allows me to ensure that the parameter is exactly 2 length? |
March 12, 2013 Re: Variadic function not recognizing static array length | ||||
---|---|---|---|---|
| ||||
Posted in reply to Zach the Mystic | On Tuesday, 12 March 2013 at 21:47:02 UTC, Zach the Mystic wrote:
> void func(string[2] a) {}
>
> void func2(T...)(T args) {
> static assert(is(typeof(args[0]) == string[2]));
> }
>
> void func3(T...)(T args) {
> static assert(args[0].length == 2);
> }
>
> func(["",""]); // Okay
> func2(["",""]); // Error: (is(string[] == string[2LU])) is false
> func3(["",""]); // Error: _param_0 cannot be read at compile time
>
> Is this the intended design? Is there a workaround which allows me to ensure that the parameter is exactly 2 length?
I'm just going to assert at runtime instead of at compile time.
assert(args[0].length == 2);
That's a good workaround, only a minor inconvenience it can't be caught at compile time.
|
March 12, 2013 Re: Variadic function not recognizing static array length | ||||
---|---|---|---|---|
| ||||
Posted in reply to Zach the Mystic | On 03/12/2013 04:10 PM, Zach the Mystic wrote: > On Tuesday, 12 March 2013 at 21:47:02 UTC, Zach the Mystic wrote: >> void func(string[2] a) {} >> >> void func2(T...)(T args) { >> static assert(is(typeof(args[0]) == string[2])); >> } >> >> void func3(T...)(T args) { >> static assert(args[0].length == 2); >> } >> >> func(["",""]); // Okay >> func2(["",""]); // Error: (is(string[] == string[2LU])) is false >> func3(["",""]); // Error: _param_0 cannot be read at compile time >> >> Is this the intended design? Is there a workaround which allows me to >> ensure that the parameter is exactly 2 length? > > I'm just going to assert at runtime instead of at compile time. > assert(args[0].length == 2); > > That's a good workaround, only a minor inconvenience it can't be caught > at compile time. Actually, this is not about variadic function templates. The type of an array literal is a slice: static assert(is(typeof(["",""]) == string[])); This doesn't help you but it is possible to cast: static assert(is(typeof(cast(string[2])["",""]) == string[2])); or use a variable with an explicit type: string[2] var = ["", ""]; static assert(is(typeof(var) == string[2])); Ali |
March 13, 2013 Re: Variadic function not recognizing static array length | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Tuesday, 12 March 2013 at 23:35:28 UTC, Ali Çehreli wrote:
> On 03/12/2013 04:10 PM, Zach the Mystic wrote:
> > On Tuesday, 12 March 2013 at 21:47:02 UTC, Zach the Mystic
> wrote:
> >> void func(string[2] a) {}
> >>
> >> void func2(T...)(T args) {
> >> static assert(is(typeof(args[0]) == string[2]));
> >> }
> >>
> >> void func3(T...)(T args) {
> >> static assert(args[0].length == 2);
> >> }
> >>
> >> func(["",""]); // Okay
> >> func2(["",""]); // Error: (is(string[] == string[2LU])) is
> false
> >> func3(["",""]); // Error: _param_0 cannot be read at compile
> time
> >>
> >> Is this the intended design? Is there a workaround which
> allows me to
> >> ensure that the parameter is exactly 2 length?
> >
> > I'm just going to assert at runtime instead of at compile
> time.
> > assert(args[0].length == 2);
> >
> > That's a good workaround, only a minor inconvenience it can't
> be caught
> > at compile time.
>
> Actually, this is not about variadic function templates. The type of an array literal is a slice:
>
> static assert(is(typeof(["",""]) == string[]));
>
> This doesn't help you but it is possible to cast:
>
> static assert(is(typeof(cast(string[2])["",""]) == string[2]));
>
> or use a variable with an explicit type:
>
> string[2] var = ["", ""];
> static assert(is(typeof(var) == string[2]));
>
> Ali
Thanks. I see that the type is a slice, but it doesn't stop func(string[2]) from taking ["",""] at compile time. I think it might have been felt to be problematic not to allow it. I think it's inconsistent though. Might be harder to include in complex parameter deduction than in explicit parameter lists.
|
March 13, 2013 Re: Variadic function not recognizing static array length | ||||
---|---|---|---|---|
| ||||
Posted in reply to Zach the Mystic | On 03/12/2013 10:47 PM, Zach the Mystic wrote: > void func(string[2] a) {} > > void func2(T...)(T args) { > static assert(is(typeof(args[0]) == string[2])); > } > > void func3(T...)(T args) { > static assert(args[0].length == 2); > } > > func(["",""]); // Okay > func2(["",""]); // Error: (is(string[] == string[2LU])) is false > func3(["",""]); // Error: _param_0 cannot be read at compile time > > Is this the intended design? Yes. > Is there a workaround which allows me to > ensure that the parameter is exactly 2 length? http://d.puremagic.com/issues/show_bug.cgi?id=9712 http://d.puremagic.com/issues/show_bug.cgi?id=9711 |
March 14, 2013 Re: Variadic function not recognizing static array length | ||||
---|---|---|---|---|
| ||||
Posted in reply to Zach the Mystic | On Tue, 12 Mar 2013 17:47:00 -0400, Zach the Mystic <reachzach@gggggmail.com> wrote: > void func(string[2] a) {} > > void func2(T...)(T args) { > static assert(is(typeof(args[0]) == string[2])); > } > > void func3(T...)(T args) { > static assert(args[0].length == 2); > } > > func(["",""]); // Okay > func2(["",""]); // Error: (is(string[] == string[2LU])) is false > func3(["",""]); // Error: _param_0 cannot be read at compile time > > Is this the intended design? Is there a workaround which allows me to ensure that the parameter is exactly 2 length? Actually an array literal's default type is a slice, not a fixed-sized array. With IFTI, the type is decided by the call, not how you use it the parameters. I filed an enhancement request a while back that would help fix this. http://d.puremagic.com/issues/show_bug.cgi?id=4998 -Steve |
March 14, 2013 Re: Variadic function not recognizing static array length | ||||
---|---|---|---|---|
| ||||
Posted in reply to Timon Gehr | On Wednesday, 13 March 2013 at 22:14:26 UTC, Timon Gehr wrote:
> On 03/12/2013 10:47 PM, Zach the Mystic wrote:
>> void func(string[2] a) {}
>>
>> void func2(T...)(T args) {
>> static assert(is(typeof(args[0]) == string[2]));
>> }
>>
>> void func3(T...)(T args) {
>> static assert(args[0].length == 2);
>> }
>>
>> func(["",""]); // Okay
>> func2(["",""]); // Error: (is(string[] == string[2LU])) is false
>> func3(["",""]); // Error: _param_0 cannot be read at compile time
>>
>> Is this the intended design?
>
> Yes.
>
>> Is there a workaround which allows me to
>> ensure that the parameter is exactly 2 length?
>
> http://d.puremagic.com/issues/show_bug.cgi?id=9712
> http://d.puremagic.com/issues/show_bug.cgi?id=9711
Man, Hara Kenji is so fast!!!!!! I didn't even know my problem wasn't just part of the design, and already it's close to being a fixed bug/enhancement!
|
March 14, 2013 Re: Variadic function not recognizing static array length | ||||
---|---|---|---|---|
| ||||
Posted in reply to Zach the Mystic | On Thursday, 14 March 2013 at 20:59:38 UTC, Zach the Mystic wrote:
> On Wednesday, 13 March 2013 at 22:14:26 UTC, Timon Gehr wrote:
>> On 03/12/2013 10:47 PM, Zach the Mystic wrote:
>>> void func(string[2] a) {}
>>>
>>> void func2(T...)(T args) {
>>> static assert(is(typeof(args[0]) == string[2]));
>>> }
>>>
>>> void func3(T...)(T args) {
>>> static assert(args[0].length == 2);
>>> }
>>>
>>> func(["",""]); // Okay
>>> func2(["",""]); // Error: (is(string[] == string[2LU])) is false
>>> func3(["",""]); // Error: _param_0 cannot be read at compile time
>>>
>>> Is this the intended design?
>>
>> Yes.
>>
>>> Is there a workaround which allows me to
>>> ensure that the parameter is exactly 2 length?
>>
>> http://d.puremagic.com/issues/show_bug.cgi?id=9712
>> http://d.puremagic.com/issues/show_bug.cgi?id=9711
>
> Man, Hara Kenji is so fast!!!!!! I didn't even know my problem wasn't just part of the design, and already it's close to being a fixed bug/enhancement!
(I meant to thank you too, Timon Gehr)
|
Copyright © 1999-2021 by the D Language Foundation