“déballage” un tuple pour appeler un correspondant pointeur de fonction

Je suis en train de les stocker dans un std::tuple un nombre variable de valeurs, qui seront ensuite utilisées comme arguments pour un appel vers un pointeur de fonction qui correspond à la stockées types.

J'ai créé un exemple simplifié montrant le problème j'ai du mal à résoudre:

#include <iostream>
#include <tuple>

void f(int a, double b, void* c) {
  std::cout << a << ":" << b << ":" << c << std::endl;
}

template <typename ...Args>
struct save_it_for_later {
  std::tuple<Args...> params;
  void (*func)(Args...);

  void delayed_dispatch() {
     //How can I "unpack" params to call func?
     func(std::get<0>(params), std::get<1>(params), std::get<2>(params));
     //But I *really* don't want to write 20 versions of dispatch so I'd rather 
     //write something like:
     func(params...); //Not legal
  }
};

int main() {
  int a=666;
  double b = -1.234;
  void *c = NULL;

  save_it_for_later<int,double,void*> saved = {
                                 std::tuple<int,double,void*>(a,b,c), f};
  saved.delayed_dispatch();
}

Normalement pour les problèmes impliquant std::tuple ou variadic templates j'écrirais un autre modèle comme template <typename Head, typename ...Tail> à évaluer de manière récursive tous les types, un par un, mais je ne peux pas voir un moyen de le faire que pour l'envoi d'un appel de fonction.

La motivation réelle pour cela est un peu plus complexe et c'est surtout un exercice d'apprentissage de toute façon. Vous pouvez supposer que je suis a remis le tuple par contrat d'une autre interface, ne peut donc pas être changé, mais que le désir de le décompresser dans un appel de fonction est la mienne. Cette aide std::bind comme un moyen bon marché de contourner le problème sous-jacent.

Ce qui est un moyen propre d'envoi de l'appel à l'aide de la std::tuple, ou une alternative meilleure façon d'atteindre le même résultat net de stockage/transfert de certaines valeurs et un pointeur de fonction jusqu'à ce que l'arbitraire d'un moment de l'avenir?

Pourquoi ne pouvez-vous pas simplement utiliser auto saved = std::bind(f, a, b, c); ... puis plus tard, juste à appeler saved()?
Pas toujours mon interface de contrôle. - Je recevoir un n-uplet par contrat de quelqu'un d'autre et veulent faire des choses avec elle par la suite.

OriginalL'auteur Flexo | 2011-10-22