I wanted to do this:
package int serialize(byte[] destination, int offset, T...)(T values)
{       
        static foreach (i, value; values)
        {
                *cast(T[i] *)(destination.ptr + offset) = value;
                offset += typeid(T[i]).tsize();
        }
        
        return offset;
}

But I got this error:
main.d(8): Error: template main.serialize cannot deduce function from argument types !()(byte[], int, byte, int), candidates are: main.d(20): main.serialize(byte[] destination, int offset, T...)(T values)

Eventually, I assumed that you couldn't do heterogeneous arguments with other arguments first.

I was able to do this and it works:
package int serialize(T...)(T values)
{
        static assert(values.length >= 2);

        auto ptr = (cast(byte[])values[0]).ptr;
        
        int offset = cast(int)values[1];

        static foreach (i, value; values)
        {
                static if (i > 1)
                {
                        *cast(T[i] *)(ptr + offset) = value;
                        offset += typeid(T[i]).tsize();
                }
        }
        
        return offset;
}

That is obviously a lot uglier. Can you have a function with non-variadic arguments followed by heterogeneous variadic arguments?

Reply via email to