boost-python在重载方法之间进行选择

时间:2011-09-28 01:32:06

标签: c++ python boost

假设存在一些具有两个重载方法的类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)

4 个答案:

答案 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))