Templates für Funktionsaufruf: Kann man das irgendwie einfacher machen?
-
Hi!
Habe einen Wrapper für Python geschrieben. Mit ihm kann ich funktionen in Python aufrufen, und an diese auch Parameter übergeben. Ich mache es derzeit so:
template <class Param1> ManagedPyObject CallFunction(const std::string& Name, Param1 p1) { wxPyBlockThreads(); PyObject* func(GetFunction(Name)); ManagedPyObject args(BuildParams(p1)); return ManagedPyObject(PyEval_CallObject(func, args)); } template <class Param1, class Param2> ManagedPyObject CallFunction(const std::string& Name, Param1 p1, Param2 p2) { wxPyBlockThreads(); PyObject* func(GetFunction(Name)); ManagedPyObject args(BuildParams(p1, p2)); return ManagedPyObject(PyEval_CallObject(func, args)); } // ... template <class Param1> PyObject* BuildParams(Param1 p1) { PyObject* args=PyTuple_New(1); PyTuple_SetItem(args, 0, OneParam(p1)); return args; } template <class Param1, class Param2> PyObject* BuildParams(Param1 p1, Param2 p2) { PyObject* args=PyTuple_New(1); PyTuple_SetItem(args, 0, OneParam(p1)); PyTuple_SetItem(args, 1, OneParam(p2)); return args; } // ...Also ich habe für jede Anzahl von Parametern zwei Funktionen. Kann man die irgendwie automatisieren, also dass ich nicht so viele Funktionen schreiben brauch, sondern eine für alle irgendwie?
-
Ich denke da gibt es 3 Möglichkeiten, zumindest wenn ich dich richtig verstanden habe:
1. Du wartest auf den neuen Standard, dort wird es variierbare Anzahl Templates geben, welche man ausrollen kann.
2. Du benutzt Boost.Python:
http://www.boost.org/doc/libs/1_35_0/libs/python/doc/index.html
Man hat mir gesagt, die Schnittstelle soll sehr gut sein.
3. Du benutzt Boost.Preprocessor:
http://www.boost.org/doc/libs/1_35_0/libs/preprocessor/doc/index.html
Mit diesen Preprocessor Anweisungen kann man "Schleifen" erzeugen, welche ähnlichen Code wiederholen. Gerade für Funktionen die immer gleich aussehen, aber einen weiteren Parameter haben, sollen damit einfach zu lösen sein.Grüssli
-
Hey!
Ich glaube boost.preprocessor ist genau das, was ich dafür brauche. boost.python verwende ich schon im hintergrund
