2010-11-05 60 views
1

使用Boost :: Python,包裝函數的正常機制可以在C++函數返回void時正常工作。不幸的是,正常的機制也有侷限性,特別是關於它所支持的功能性。所以我需要使用boost :: python :: raw_function來封裝我的函數,但是當我的函數返回void時它不能編譯。這裏有一個簡單的測試案例:Boost :: Python raw_function returns 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

讓您可以與普通方法元數問題由#定義-ING的BOOST_PYTHON_MAX_ARITY宏。 – 2010-11-08 19:32:00

+0

感謝您指出這一點。我現在正在做這個而不是raw_function,結果在我的機器上更快。 – 2010-11-29 05:57:01

回答

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

謝謝,這正是我希望看到的。 – 2010-11-06 22:14:48