1

使用 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*) [with 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*) 实例化 [with Caller = boost::python::detail::raw_dispatcher, Sig = boost::mpl::vector1]'</p>

void.cpp:8:从这里实例化

/usr/local/include/boost/python/raw_function.hpp:36:错误:无效使用无效表达式

目前,我可以通过让我的函数返回一个虚拟值来解决这个问题,但这有点不令人满意。其他人遇到过这个问题吗?

4

1 回答 1

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));
}
于 2010-11-06T12:56:10.830 回答