Boost::Python 原始函数返回无类型

1 投票
1 回答
1479 浏览
提问于 2025-04-16 06:38

在使用Boost::Python时,通常用来包装函数的方式对于返回void的C++函数是可以正常工作的。不过,这种常规的方式也有一些限制,特别是在支持的函数参数数量方面。因此,我需要使用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: 错误: 无效的 void 表达式使用

目前,我可以通过让我的函数返回一个虚假的值来解决这个问题,但这样做让我觉得不太满意。有没有其他人遇到过这个问题?

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

撰写回答