On Mon, Jul 21, 2014 at 12:55:34AM +0200, Daniel Gibson via Digitalmars-d-learn wrote: > Hi, > I have a variadic templated function and want to call a C varargs function. > I want to be able to pass static arrays, which D2 passes by value and C by > reference, so I'd like to automagically translate those arguments. > > My idea was something like this: > > extern (C) origFun(int x, ...); > > T transTupleElem(T)(T arg) { return arg; } > > float* transTupleElem(T : float[3])(T arg) { > return arg.ptr; > } > > void fun(T...)(int x, T argTuple) { > // create a new tuple type that replaces all static float[3] > // arrays with float* to emulate C call-by-reference behavior > alias ReplaceAll!(float[3], float*, T) ModifiedTuple; > ModifiedTuple modTuple; > > foreach(size_t i ; 0 .. T.length) > modTuple[i] = transTupleElem(argTuple[i]); // BOOM! > > origFun(modTuple); // or is it modTuple.expand ? > } > > However, this doesn't work (dmd 2.065 linux64), because: > "Error: variable i cannot be read at compile time" [...]
Try this: import std.typecons : staticIota; foreach (i; staticIota!(0, T.length)) modTuple[i] = transTupleElem(argTuple[i]); T -- The volume of a pizza of thickness a and radius z can be described by the following formula: pi zz a. -- Wouter Verhelst