假设存在一些具有两个重载方法的类Foo:
class Foo
{
...
void m1(A& a);
void m1(B& b);
我需要在boost-python上公开其中一种方法:
boost::python::class_<Foo>("Foo")
.def("m1", &Foo::m1)
我应该如何指定m1(A&a)
的签名应该用于m1(B&b)
答案 0 :(得分:26)
void (Foo::*m1)(A&) = &Foo::m1;
boost::python::class_<Foo>("Foo")
.def("m1", m1)
答案 1 :(得分:24)
只是为了完成,也可以在python端暴露它们:
void (Foo::*m1_a)(A&) = &Foo::m1;
void (Foo::*m1_b)(B&) = &Foo::m1;
boost::python::class_<Foo>("Foo")
.def("m1", m1_a)
.def("m1", m1_b)
答案 2 :(得分:6)
虽然其他答案是正确的,但不需要使用临时变量或}
做任何恶作剧。
static_cast
函数原型如下所示:
def
正如您所看到的,第一个模板参数(template <class Fn>
class_& def(char const* name, Fn fn);
template <class Fn, class A1>
class_& def(char const* name, Fn fn, A1 const&);
template <class Fn, class A1, class A2>
class_& def(char const* name, Fn fn, A1 const&, A2 const&);
template <class Fn, class A1, class A2, class A3>
class_& def(char const* name, Fn fn, A1 const&, A2 const&, A3 const&);
)是您要包装的函数指针的类型。通常,编译器会为您推导出所有模板参数。但是,如果存在歧义,则需要帮助编译器。如果函数指针由于重载函数而不明确,则必须明确提供正确的类型。在你的情况下:
Fn
简单,不是吗?无需在外面投射或捕获。同样的事情对于在模块级别创建独立功能也是有效的,即使用boost::python::class_<Foo>("Foo")
.def<void (Foo::*)(A&)>("m1", &Foo::m1)
.def<void (Foo::*)(B&)>("m1", &Foo::m1)
;
。
答案 3 :(得分:5)
您可以使用static_cast
指定要使用的签名。使用此方法,您无需创建命名函数指针,同时还可以在单行上下文中保持重载分辨率。
boost::python::class_<Foo>("Foo")
.def("m1", static_cast<void (Foo::*)(A&)>(&Foo::m1))
.def("m1", static_cast<void (Foo::*)(B&)>(&Foo::m1))