在我嘗試使用C++對Python代碼進行網格劃分的世界裏,事情變得越來越複雜。發送Python函數作爲Boost.Function參數
本質上,我希望能夠分配一個回調函數,以便在HTTP調用接收到響應之後使用,並且我希望能夠從C++或Python中執行此操作。
換句話說,我希望能夠從C調用這個++:
http.get_asyc("www.google.ca", [&](int a) { std::cout << "response recieved: " << a << std::endl; });
,這在Python:
def f(r):
print str.format('response recieved: {}', r)
http.get_async('www.google.ca', f)
我已成立了一個demo on Coliru,準確顯示我試圖完成。下面是代碼,而且我得到的錯誤:
C++
#include <boost/python.hpp>
#include <boost/function.hpp>
struct http_manager
{
void get_async(std::string url, boost::function<void(int)> on_response)
{
if (on_response)
{
on_response(42);
}
}
} http;
BOOST_PYTHON_MODULE(example)
{
boost::python::class_<http_manager>("HttpManager", boost::python::no_init)
.def("get_async", &http_manager::get_async);
boost::python::scope().attr("http") = boost::ref(http);
}
的Python
import example
def f(r):
print r
example.http.get_async('www.google.ca', f)
錯誤
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
Boost.Python.ArgumentError: Python argument types in
HttpManager.get_async(HttpManager, str, function)
did not match C++ signature:
get_async(http_manager {lvalue}, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::function<void (int)>)
我不知道爲什麼function
不自動轉換爲boost::function
。
我已經問了SO上的vaguely similar question,並得到了一個驚人的答案。我也想知道在這裏給出的答案中的類似方法是否也可以應用於這個用例。
非常感謝您的支持!
不幸的是在這種情況下,'http'對象是全球訪問,基本上是一個單身,所以製作的包裝將無法正常工作,並我想避免使用Python實現細節來污染類。 –
@ColinBasnett我最近的更新應該解決你提到的問題。 – doqtor
我的天,它的作品。謝謝! –