Pages

lundi 20 août 2012

Comment passer les valeurs d'une tuple à une fonction ?

Par exemple fonction g() retourne une tuple de trois éléments: int, double et string.

std::tuple<int, double, std::string> g();

Une seconde fonction nommée f() attend 3 éléments: string, int et double.

void f(std::string s, int i, double d);

Et nous voulons passer les valeurs de la tuple à f().

auto t = g();
f(std::get<2>(t), std::get<0>(t), std::get<1>(t));

Mais ceci n'est pas suffisant, nous voulons maintenant avoir une fonction qui le fasse pour nous et de façon plus généraliste. On lui indique les 2 fonctions et les index de la tuple à transférer.

template<std::size_t... _indexes>
class parameter_index;

template<typename _TupleGenerator, typename _Function,
std::size_t... _Indexes>
void delegate(const parameter_index<_indexes...>& ,
              _TupleGenerator generator,
              _Function func); 

Maintenant il suffit simplement de donner les index à std::get() pour récupérer toutes les valeurs:

{
 /*return */func(std::get<_indexes>(generator())...);
}

Et c'est tout simple à utiliser:

delegate(parameter_index<2,0,1>(), &g, &f);

Avec un trait qui génère automatiquement le parameter_index et si les valeurs de la tuple sont à transmettre dans le même ordre, il est possible de simplifier en ne mettant pas le parameter_index en paramètre. Un exemple avec tuple_apply tout droit sorti de ma lib falcon.

Aucun commentaire: