"Auspacken", ein Tupel zu nennen, eine matching-Funktion Zeiger

Ich versuche zu speichern in einer std::tuple eine unterschiedliche Anzahl von Werten, die später verwendet werden als Argumente für einen Aufruf einer Funktion, Zeiger mit dem gespeicherten Typen.

Habe ich ein Vereinfachtes Beispiel zeigt das problem, das ich bin kämpfen, um Sie zu lösen:

#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();
}

Normalerweise bei Problemen mit std::tuple oder variadic templates würde ich schreiben eine andere Vorlage wie template <typename Head, typename ...Tail> rekursiv bewerten alle Typen eins nach dem anderen, aber ich kann nicht sehen, ein Weg, das zu tun, für die Versendung eines Funktionsaufrufs.

Die eigentliche motivation für dieses ist etwas komplexer und es ist meist nur eine Lernübung sowieso. Sie können davon ausgehen, dass ich übergab das Tupel, das durch den Vertrag von einer anderen Schnittstelle, also können nicht geändert werden, aber dass der Wunsch, entpacken Sie es in einen Aufruf der Funktion ist von mir. Diese Regeln mit std::bind als eine billige Art und Weise zu umgehen, das zugrunde liegende problem.

Was ist eine saubere Art der Versendung der Anruf mit der std::tuple oder eine alternative der bessere Weg, um die gleiche Netto-Ergebnis von Speicherung/Weiterleitung einige Werte und eine Funktion Zeiger bis zu einem beliebigen zukünftigen Zeitpunkt?

Warum können Sie nicht einfach verwenden auto saved = std::bind(f, a, b, c); ... später dann einfach anrufen saved()?
Nicht immer mein interface zu Steuern. Ich erhalten ein Tupel, das durch den Vertrag von jemand anders und wollen die Dinge mit zu tun es anschließend.

InformationsquelleAutor Flexo | 2011-10-22

Schreibe einen Kommentar