uint[3] not equivalent to void[12]?

Nicholas Wilson iamthewilsonator at hotmail.com
Fri Feb 9 16:28:50 UTC 2018


On Friday, 9 February 2018 at 15:50:24 UTC, Ralph Doncaster wrote:
> On Friday, 9 February 2018 at 15:24:27 UTC, Mike Parker wrote:
>> On Friday, 9 February 2018 at 15:05:33 UTC, Ralph Doncaster 
>> wrote:
>>> This seems odd to me.  Is there a way I can make a function 
>>> that takes an array of any type but only of a specific size 
>>> in bytes?
>>>
>>> void.d(8): Error: function void.foo (void[12] arr) is not 
>>> callable using argument types (uint[3])
>>> Failed: ["/usr/bin/dmd", "-v", "-o-", "void.d", "-I."]
>>> void foo(void [12] arr)
>>> {
>>> }
>>>
>>> void main()
>>> {
>>>     uint[3] arr;
>>>     foo(arr);
>>> }
>>
>> void has no size, so what does it mean to have 12 of them?
>
> according to the docs and my testing, the size of a void array 
> element is 1,

Correct.

> so the following code prints 12:
> import std.stdio;
>
> void foo(void [] arr)
> {
>     writeln("length: " arr.length);
> }
>
> void main()
> {
>     uint[3] arr;
>     foo(arr);
> }
>
> I thought about using templates, but I was looking for a simple 
> way of making a function that takes an array of 12 bytes, 
> whether it is uint[3], ubyte[12], or ushort[6].

uint[3] and void[12] have the same size but are different types 
so the compiler will reject it.
you can reinterpret cast them(i.e. *cast(void[12])(&arr) ), but 
this is a rather blunt tool. Is it safe in the case that the 
types size is at least 12 but not safe in general.

>Is there a way I can make a function that takes an array of any 
>type but only of a specific size in bytes?

With a template that constrains the types size:

void foo(T)(T t) if (T.sizeof == 12)
{
     //...
}

alternately reject incorrect values at runtime

void foo(ubyte[] t)
in
{
     assert(t.length == 12);
}
do
{
     //...
}



More information about the Digitalmars-d-learn mailing list