/ / Boost :: Python raw_function vracia neplatný - c ++, python, boost, boost-python

Boost :: Python raw_function vráti void - c ++, python, boost, boost-python

Pri použití funkcie Boost :: Python normálny mechanizmus pre obtiažne funkcie pracuje správne s návratom funkcií C ++ void, Bohužiaľ, normálny mechanizmus tiež existujeobmedzenia, najmä s ohľadom na funkčnosť, ktorú podporuje. Aby som zabalil svoju funkciu, musím použiť boost :: python :: raw_function, ale keď sa moja funkcia vráti, nebude sa kompilovať. void, Tu je jednoduchý skúšobný prípad:

#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));
}

Čo dáva chybu:

/ Usr / local / include / posilnenie / Python / raw_function.hpp: Vo funkcii člena 'PyObject * boost :: python :: detail :: raw_dispatcher :: operator () (PyObject *, PyObject *) [s F = void (*) (boost :: python :: tuple, boost :: python :: dict)]:

/usr/local/include/boost/python/object/py_function.hpp:94: instantiate od '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: okamžité odtiaľto

/usr/local/include/boost/python/raw_function.hpp:36: chyba: neplatné použitie neplatného výrazu

Momentálne to môžem obísť tak, že moja funkcia vráti falošnú hodnotu, ale je to trochu neuspokojivé. Došli k tomuto problému ostatní ľudia?

odpovede:

2 pre odpoveď č. 1

Myslím si, že to tak je raw_function() funguje. Očakáva, že vaša funkcia vráti objekt Python.

V Pythone sa najbližšie dostanete k funkcii, ktorá sa vracia void je funkcia vracajúca sa None, Myslím si, že tento prístup by bol vo vašom prípade najlepší (a nie dokonca taký škaredý):

#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));
}