/ / Boost :: Python raw_function powracający void - c ++, python, boost, boost-python

Boost :: Python raw_function powracający void - c ++, python, boost, boost-python

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 № 1

Myś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));
}