Boost::Python 原始函数返回无类型
在使用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 个回答
我觉得 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));
}