Map one tuple to another Tuple of different type

H. S. Teoh via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jul 21 11:08:25 PDT 2014


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


More information about the Digitalmars-d-learn mailing list