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: エラー: void 式の使用が無効です

今のところ、関数にダミーの値を返させることでこれを回避できますが、それでは少し満足できません。他の人がこの問題に遭遇しましたか?

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 に答える