Boost :: Python raw_function возвращает void - PullRequest
1 голос
/ 06 ноября 2010

Используя Boost :: Python, нормальный механизм для переноса функций работает корректно с функциями C ++, возвращающими void. К сожалению, обычный механизм также имеет ограничения, особенно в отношении функции, которую он поддерживает. Поэтому мне нужно использовать boost :: python :: raw_function, чтобы обернуть мою функцию, но она не компилируется, когда моя функция возвращает void. Вот простой тестовый пример:

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

Что выдает ошибку:

/ usr / local / include / boost / python / raw_function.hpp: в функции-члене 'PyObject * boost :: python :: detail :: raw_dispatcher :: operator () (PyObject *, PyObject *) [с F = void (*) (boost :: python :: tuple, boost :: python :: dict)] ':

/ usr / local / include / boost / python / object / py_function.hpp: 94: создается из 'PyObject * boost :: python :: objects :: full_py_function_impl :: operator () (PyObject *, PyObject *) [ с Caller = boost :: python :: detail :: raw_dispatcher, Sig = boost :: mpl :: vector1] '

void.cpp: 8: создается здесь

/ usr / local / include / boost / python / raw_function.hpp: 36: ошибка: недопустимое использование пустого выражения

На данный момент я могу обойти это, заставив мою функцию возвращать фиктивное значение, но это несколько неудовлетворительно. Другие люди сталкивались с этой проблемой?

1 Ответ

2 голосов
/ 06 ноября 2010

Я думаю, что так работает raw_function(). Ожидается, что ваша функция вернет объект Python.

В Python ближе всего к функции, возвращающей void, будет функция, возвращающая None. Я думаю, что подход был бы лучшим (и даже не таким уродливым) в вашем случае:

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