Boost.Bind с функцией и Python - PullRequest
       34

Boost.Bind с функцией и Python

0 голосов
/ 03 августа 2011

Я получаю некоторые ошибки во время компиляции, и я не могу понять, почему это так. Следующий код откажется от компиляции, выдав мне следующие ошибки:

ошибка C2664: 'void (PyObject *, const char *, boost :: type *)': невозможно преобразовать параметр 1 из 'const char *' в 'PyObject *'
ошибка C2664: 'void (PyObject *, const char *, boost :: type *)': невозможно преобразовать параметр 3 из 'boost :: shared_ptr' в 'boost :: type *'

PyObject* self = ...;
const char* fname = "...";
boost::function<void (boost::shared_ptr<Event>)> func;
func = boost::bind(boost::python::call_method<void>, self, fname, _1);

1 Ответ

1 голос
/ 03 августа 2011

boost::python::call_method состоит из нескольких перегруженных функций, которые принимают различное количество аргументов, определенных следующим образом:

template <class R>
R call_method(PyObject* self, char const* method);
template <class R, class A1>
R call_method(PyObject* self, char const* method, A1 const&);
template <class R, class A1, class A2>
R call_method(PyObject* self, char const* method, A1 const&, A2 const&);
...

Когда вы вызываете его напрямую (например, call_method<void>(self, name, arg1, arg2)), компилятор может выбрать правильныйПерегрузка и шаблонные типы аргументов автоматически.Но когда вы передаете указатель функции на call_method в bind, вам нужно вручную указать типы перегрузки и аргументов, используя:

call_method<ReturnType, Arg1Type, Arg2Type, ...>

Или в этом случае:

call_method<void, boost::shared_ptr<Event> >
...