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