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:
Enregistrer un commentaire