| Thread overview | |||||||||
|---|---|---|---|---|---|---|---|---|---|
|
June 07, 2015 simple template constraint - compile error. | ||||
|---|---|---|---|---|
| ||||
Should be real simple. But adding a small template constraint causes compile failure. I've got the following working code:
int arrayByteSize(T)(T[] someArray)
{
ubyte[] arr = cast(ubyte[]) someArray;
return arr.length; // length is implicitly converted to bytes.
}
// running the following code:
GLfloat[] dynamicVerts = [0.0, 1.0,-1.0, -1.0, 1.0, -1.0 ];
int lengthInElements = dynamicVerts.length;
myLog!lengthInElements;
int sizeInBytes = dynamicVerts.arrayByteSize;
myLog!sizeInBytes;
// returns the correct results:
lengthInElements = 6
sizeInBytes = 24
However, when I try to add a simple constraint to the function like so:
int arrayByteSize(T)(T[] someArray) if (isDynamicArray(T))
{
ubyte[] arr = cast(ubyte[]) someArray;
return arr.length; // length is implicitly converted to bytes.
}
I get Error: cannot pass type float as a function argument
After I comment out //int sizeInBytes = arrayByteSize(dynamicVerts);
everything compiles. I've been fighting this for hours. Am I overlooking the obvious?
| ||||
June 07, 2015 Re: simple template constraint - compile error. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to WhatMeWorry | On Sunday, 7 June 2015 at 23:08:02 UTC, WhatMeWorry wrote:
> However, when I try to add a simple constraint to the function like so:
>
> int arrayByteSize(T)(T[] someArray) if (isDynamicArray(T))
You forgot an exclamation mark here. Make that: isDynamicArray!(T)
| |||
June 08, 2015 Re: simple template constraint - compile error. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Sunday, 7 June 2015 at 23:13:14 UTC, anonymous wrote:
>> int arrayByteSize(T)(T[] someArray) if (isDynamicArray(T))
>
> You forgot an exclamation mark here. Make that: isDynamicArray!(T)
Also, if you pass int[] to that function, for example, T will *not* be int[] - it will actually be int.
(T)(T[])
means take an array of T. If you pass int[], it is an array of int, so that's why T is just int instead of an array.
You probably want to remove that [] from the signature.
| |||
June 08, 2015 Re: simple template constraint - compile error. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Sunday, 7 June 2015 at 23:13:14 UTC, anonymous wrote: > On Sunday, 7 June 2015 at 23:08:02 UTC, WhatMeWorry wrote: >> However, when I try to add a simple constraint to the function like so: >> >> int arrayByteSize(T)(T[] someArray) if (isDynamicArray(T)) > > You forgot an exclamation mark here. Make that: isDynamicArray!(T) Thanks, but I still can't get out of the woods. I've distilled everything down to the following: ------------------------------------------------------------------ int arrayByteSize(T)(T[] someArray) { ubyte[] arr = cast(ubyte[]) someArray; return arr.length; } int i = arrayByteSize(dynamicArray); // works with above function. ------------------------------------------------------------------ However, if I just add a constraint to the function template int arrayByteSize(T)(T[] someArray) if (isDynamicArray!(T)) { ubyte[] arr = cast(ubyte[]) someArray; return arr.length; } int i = arrayByteSize(dynamicArray); // Same call - all hell breaks loose. Error arrayByteSize(T)(T[] someArray) if (isDynamicArray!T) Error: template compilelinkshaders.arrayByteSize cannot deduce function from argument types !()(float[]), candidates are: Why would a working function call stop working just because a constraint was added to the function? | |||
June 08, 2015 Re: simple template constraint - compile error. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to WhatMeWorry | On Monday, 8 June 2015 at 04:02:26 UTC, WhatMeWorry wrote:
> Why would a working function call stop working just because a constraint was added to the function?
because T is float... which isn't a dynamic array, so the constraint doesn't match. Just remove the [] after T[] in your signature and you should be ok.
| |||
June 08, 2015 Re: simple template constraint - compile error. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to WhatMeWorry | On Monday, 8 June 2015 at 04:02:26 UTC, WhatMeWorry wrote: > On Sunday, 7 June 2015 at 23:13:14 UTC, anonymous wrote: >> On Sunday, 7 June 2015 at 23:08:02 UTC, WhatMeWorry wrote: >>> However, when I try to add a simple constraint to the function like so: >>> >>> int arrayByteSize(T)(T[] someArray) if (isDynamicArray(T)) >> >> You forgot an exclamation mark here. Make that: isDynamicArray!(T) > > Thanks, but I still can't get out of the woods. I've distilled > everything down to the following: > > ------------------------------------------------------------------ > > int arrayByteSize(T)(T[] someArray) > { > ubyte[] arr = cast(ubyte[]) someArray; > return arr.length; > } > > int i = arrayByteSize(dynamicArray); // works with above function. > > ------------------------------------------------------------------ > > However, if I just add a constraint to the function template > > int arrayByteSize(T)(T[] someArray) > if (isDynamicArray!(T)) > { > ubyte[] arr = cast(ubyte[]) someArray; > return arr.length; > } > > int i = arrayByteSize(dynamicArray); // Same call - all hell breaks loose. > > Error arrayByteSize(T)(T[] someArray) if (isDynamicArray!T) > Error: template compilelinkshaders.arrayByteSize cannot deduce function from argument types !()(float[]), candidates are: > > Why would a working function call stop working just because a constraint was added to the function? Oops, I posted before I say Mr. Ruppe's comment. Also, if you pass int[] to that function, for example, T will *not* be int[] - it will actually be int. (T)(T[]) means take an array of T. If you pass int[], it is an array of int, so that's why T is just int instead of an array. You probably want to remove that [] from the signature. ------------------------------------------------------------ My code seems to be working fine, or is that just by accident? float[] dynamicArray = [1.0, 0.0, 1.0]; int i = arrayByteSize(dynamicArray); myLog!dynamicArray; dynamicArray = [1, 0, 1] ------------------------------------------------------------ I was trying to draw inspiration from the TDPL with Andrei's function T[] find(T, E) (T[] haystack, E needle)... | |||
June 08, 2015 Re: simple template constraint - compile error. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to WhatMeWorry |
Just a recap. Here's the final fix. Thanks to Anonymous and Adam.
int arrayByteSize(T)(T someArray) if (isDynamicArray!(T))
{
ubyte[] arr = cast(ubyte[]) someArray;
return arr.length;
}
float[] dynamicArray = [1.1, 3.0, 1.0, 7.3];
sizeInBytes = arrayByteSize(dynamicArray);
lengthInElements = dynamicVerts.length;
myLog!dynamicArray;
myLog!lengthInElements;
myLog!sizeInBytes;
dynamicArray = [1.1, 3, 1, 7.3]
lengthInElements = 6
sizeInBytes = 16
And
float[3] staticArray = [3.0, 2.0, 1.0];
sizeInBytes = arrayByteSize(staticArray); // Does not Compile!
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply