2010-11-05 3 views
1

Использование Boost :: Python, нормальный механизм для обертывания функций работает корректно с функциями C++, возвращающими void. К сожалению, нормальный механизм также имеет ограничения, особенно в отношении функции, которую он поддерживает. Поэтому мне нужно использовать boost :: python :: raw_function для переноса моей функции, но она не компилируется, когда моя функция возвращает void. Вот простой тест:Boost :: Python raw_function return 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: In member function ‘PyObject* boost::python::detail::raw_dispatcher::operator()(PyObject*, PyObject*) [with F = void (*)(boost::python::tuple, boost::python::dict)]’:

/usr/local/include/boost/python/object/py_function.hpp:94: instantiated from ‘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: instantiated from here

/usr/local/include/boost/python/raw_function.hpp:36: error: invalid use of void expression

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

+0

Вы можете получить вокруг вопросов Arity с обычным методом с помощью # определить ингу BOOST_PYTHON_MAX_ARITY макрос. –

+0

Спасибо, что указали это. Я делаю это сейчас вместо raw_function, он оказывается быстрее на моей машине. –

ответ

2

Я думаю, что так работает 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)); 
} 
+0

Спасибо, это именно то, что я надеялся увидеть. –

Смежные вопросы