www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Variadic function not recognizing static array length

reply "Zach the Mystic" <reachzach gggggmail.com> writes:
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?
Mar 12 2013
next sibling parent reply "Zach the Mystic" <reachzach gggggmail.com> writes:
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.
Mar 12 2013
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
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
Mar 12 2013
parent "Zach the Mystic" <reachzach gggggmail.com> writes:
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.
Mar 13 2013
prev sibling next sibling parent reply Timon Gehr <timon.gehr gmx.ch> writes:
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
Mar 13 2013
parent reply "Zach the Mystic" <reachzach gggggmail.com> writes:
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!
Mar 14 2013
parent "Zach the Mystic" <reachzach gggggmail.com> writes:
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)
Mar 14 2013
prev sibling parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
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
Mar 14 2013