Map one tuple to another Tuple of different type
    Daniel Gibson via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Sun Jul 20 15:55:34 PDT 2014
    
    
  
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"
In C++11 (where almost everything else about variadic templates is 
pretty painful), this could probably be done like:
   template<typename... T>
   void fun(T... args)
   {
     origFun( transTupleElem(args)... );
   }
so I guess it shouldn't be too hard to do something equivalent in D?
I looked for some kind of staticMap() function that could map values 
from one tuple to another (of the same type), but only found 
std.typetuple.staticMap() which only seems to modify types in 
TypeTuples, not values in tuple instances.
Cheers,
Daniel
    
    
More information about the Digitalmars-d-learn
mailing list