Dieser Code von Benutzer Faheem Mitha, basiert auf Benutzer Johannes Schaub - Litbs Antwort in diesem SO. Dieser Code macht genau das, was ich suche, nämlich die Umwandlung eines tuple
in ein Parameterpaket, aber ich verstehe diesen Code nicht gut genug und dachte daher, dass ich eine neue Diskussion erstellen werde, die bei der Metaprogrammierung von Neulingen wie mir helfen könnte. Also, bitte verzeihen Sie die doppelte Buchung.Tuple zu Parameter pack
nun auf den Code bewegen
#include <tuple>
#include <iostream>
using std::cout;
using std::endl;
template<int ...> struct seq {};
template<int N, int ...S> struct gens : gens<N - 1, N - 1, S...> { };
template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };
double foo(int x, float y, double z)
{
return x + y + z;
}
template <typename ...Args>
struct save_it_for_later
{
std::tuple<Args...> params;
double(*func)(Args...);
double delayed_dispatch()
{
return callFunc(typename gens<sizeof...(Args)>::type()); // Item #1
}
template<int ...S>
double callFunc(seq<S...>)
{
return func(std::get<S>(params) ...);
}
};
int main(void)
{
std::tuple<int, float, double> t = std::make_tuple(1, (float)1.2, 5);
save_it_for_later<int, float, double> saved = { t, foo };
cout << saved.delayed_dispatch() << endl;
return 0;
}
Ich bin 1 oben durch Artikel # völlig verwirrt:
- Welchen Zweck hat
typename
auf dieser Linie dienen? - Ich verstehe, dass
gens<sizeof...(Args)>::type()
aufgens<3>::type()
erweitert wird, aber das scheint wedertemplate<int N, int ...S> struct gens : gens<N - 1, N - 1, S...> { };
nochtemplate<int ...S> struct gens<0, S...>
zu entsprechen. Ich vermisse den Punkt offensichtlich und würde mich freuen, wenn jemand erklären könnte, was hier passiert.
Ich verstehe, dass callFunc
in dieser Form aufgerufen wird callFunc(seq<0,1,2>)
und die return-Anweisung dieser Methode selbst zu return func(std::get<0>(params), std::get<1>(params), std::get<2>(params)
erweitert und das ist, was diese Regelung Arbeit mache, aber ich kann nicht trainieren, wie dieser seq<0,1,2>
Typ erzeugt wird.
Hinweis: Mit std::index_sequence_for
ist keine Option, mein Compiler unterstützt keine C++ 14 Funktionen.
PS: Kann diese Technik als Template-Metaprogrammierung klassifiziert werden?
1) Um den Compiler zu informieren, dass 'gens :: type' ist ein Typ, und nicht etwa eine Member-Funktion. 2) Parameterpakete können leer sein. –
'gens <3>' passt auch zu 'template struct gens', wobei' N == 3' und 'S' ein leeres Paket sind. –
Grundsätzlich ist 'seq' [std :: index_sequence'] (http://en.cppreference.com/w/cpp/utility/integer_sequence) und' gens' ist 'std :: make_index_sequence' –