Also, ich versuche, besser Metaprogrammierung zu lernen, und ich finde, dies ist es eine gute Übung.
Ich versuche Code zu schreiben, der eine Funktion mit einer beliebigen Anzahl von Argumenten zurückrufen kann, die ich gerne weitergegeben habe.
// First function to call int add(int x, int y) ; // Second function to call double square(double x) ; // Third func to call void go() ;
Die Erstellung Code Rückruf sollte wie folgt aussehen:
// Write a callback object that // will be executed after 42ms for "add" Callback<int, int, int> c1 ; c1.func = add ; c1.args.push_back(2); // these are the 2 args c1.args.push_back(5); // to pass to the "add" function // when it is called Callback<double, double> c2 ; c2.func = square ; c2.args.push_back(52.2) ;
Was ich denke, ist, mit Metaprogrammierung Ich möchte in der Lage sein, Rückrufe wie zu erklären, eine Struktur wie folgt schreiben (bitte denken Sie daran, das ist sehr Pseudo-Code)
<TEMPLATING ACTION <<ANY NUMBER OF TYPES GO HERE>> > struct Callback { double execTime ; // when to execute TYPE1 (*func)(TYPE2 a, TYPE3 b) ; void* argList ; // a stored list of arguments // to plug in when it is time to call __func__ } ;
Also für beim Aufruf mit
Callback<int, int, int> c1 ;
Sie automatisch für Sie durch < HARDCORE Templating ACTION > eine Struktur wie
struct Callback { double execTime ; // when to execute int (*func)(int a, int b) ; void* argList ; // this would still be void*, // but I somehow need to remember // the types of the args.. } ;
Alle Zeiger in die richtige Richtung, um loszulegen auf das Schreiben dieses erhalten gebaut würde?
Variadic Templates sind Teil von C++ 0x. Ein Compiler, der sie unterstützt (oder sogar einen Compiler mit weniger C++ 0x Unterstützung), wird auch C++ 0x Funktionsobjekte und 'std :: bind' enthalten, was ähnlich wie boost :: bind ist und implementiert, was Sie sind sprechen über. – Potatoswatter