Używając Boost :: Python, normalny mechanizm do zawijania funkcji działa poprawnie z powracającymi funkcjami C ++ void
. Niestety, ma również normalny mechanizmograniczenia, w szczególności w odniesieniu do funkcji, którą obsługuje. Więc potrzebuję użyć boost :: python :: raw_function do zawijania mojej funkcji, ale nie kompiluje się, gdy moja funkcja zwraca void
. Oto prosty przypadek testowy:
#include <boost/python.hpp>
#include <boost/python/raw_function.hpp>
void entry_point(boost::python::tuple args, boost::python::dict kwargs) { }
BOOST_PYTHON_MODULE(module)
{
boost::python::def("entry_point", boost::python::raw_function(&entry_point));
}
Który daje błąd:
/ usr / local / include / boost / python / raw_function.hpp: W funkcji członka 'PyObject * boost :: python :: detail :: raw_dispatcher :: operator () (PyObject *, PyObject *) [z F = void (*) (boost :: python :: tuple, boost :: python :: dict)] ":
/usr/local/include/boost/python/object/py_function.hpp:94: Utworzono z 'PyObject * boost :: python :: objects :: full_py_function_impl :: operator () (PyObject *, PyObject *) [with Caller = boost :: python :: detail :: raw_dispatcher, Sig = boost :: mpl :: vector1] '
void.cpp: 8: utworzono tutaj
/usr/local/include/boost/python/raw_function.hpp:36: error: nieprawidłowe użycie pustego wyrażenia
Na chwilę obecną mogę obejść to, zwracając wartość funkcji, ale to jest trochę niesatysfakcjonujące. Czy inni ludzie napotkali ten problem?
Odpowiedzi:
2 dla odpowiedzi № 1Myślę, że tak właśnie jest raw_function()
Prace. Oczekuje, że twoja funkcja zwróci obiekt Pythona.
W Pythonie najbliżej znajdziesz funkcję powracającą void
jest funkcją zwracającą None
. Myślę, że to podejście byłoby najlepsze (i nawet nie brzydkie) w twoim przypadku:
#include <boost/python.hpp>
#include <boost/python/raw_function.hpp>
using namespace boost::python;
namespace
{
object entry_point(tuple args, dict kwargs)
{
return object();
}
}
BOOST_PYTHON_MODULE(foo)
{
def("entry_point", raw_function(&entry_point));
}