使用函数和 Python 进行 Boost.Bind

发布于 11-27 11:17 字数 513 浏览 1 评论 0原文

我遇到一些编译时错误,但我不明白这是为什么。以下代码将拒绝编译,并给出以下错误:

错误 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);

I get some compile time errors and I can't understand why that is. The following code will refuse to compile, giving me the following errors:

error C2664: 'void (PyObject *,const char *,boost::type *)' : cannot convert parameter 1 from 'const char *' to 'PyObject *'
error C2664: 'void (PyObject *,const char *,boost::type *)' : cannot convert parameter 3 from 'boost::shared_ptr' to '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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

双马尾2024-12-04 11:17:01

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(self, name, arg1, arg2)),编译器可以自动选择正确的重载和模板化参数类型。但是,当您将指向 call_method 的函数指针传递给 bind 时,您需要手动指定重载和参数类型,方法是:

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

或者在本例中:

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

boost::python::call_method consists of several overloaded functions that take a different number of arguments, defined like this:

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&);
...

When you call it directly (e.g. call_method<void>(self, name, arg1, arg2)), the compiler can choose the correct overload and templated argument types automatically. But when you pass a function pointer to call_method into bind, you need to manually specify the overload and argument types, by using:

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

Or in this case:

call_method<void, boost::shared_ptr<Event> >
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文