Все усложняется в моем мире попыток соединить код Python с моим C++.
По сути, я хочу иметь возможность назначать функцию обратного вызова, которая будет использоваться после того, как 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)
Я установил демонстрацию на 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);
}
Питон
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 и получил потрясающий ответ. Мне также интересно, можно ли применить аналогичный метод в приведенном там ответе и к этому варианту использования.
Большое спасибо за любую поддержку!