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

Dew*_*wfy 20 c++ python boost

假设存在一些具有两个重载方法的类Foo:

class Foo
{
  ...
   void m1(A& a);
   void m1(B& b);
Run Code Online (Sandbox Code Playgroud)

我需要在boost-python上公开这些方法之一:

boost::python::class_<Foo>("Foo")
    .def("m1", &Foo::m1)
Run Code Online (Sandbox Code Playgroud)

我应该如何指定m1(A&a)应该使用的签名m1(B&b)

Luc*_*ton 26

void (Foo::*m1)(A&) = &Foo::m1;
boost::python::class_<Foo>("Foo")
    .def("m1", m1)
Run Code Online (Sandbox Code Playgroud)


Wer*_*ner 25

只是为了完成,它们也可以在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)
Run Code Online (Sandbox Code Playgroud)


vac*_*zek 8

虽然其他答案是正确的,但没有必要使用临时变量或任何恶作剧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&);
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个模板参数(Fn)是您要包装的函数指针的类型.通常,编译器会为您推导出所有模板参数.但是,如果存在歧义,则需要帮助编译器.如果函数指针由于重载函数而不明确,则必须明确提供正确的类型.在你的情况下:

boost::python::class_<Foo>("Foo")
    .def<void (Foo::*)(A&)>("m1", &Foo::m1)
    .def<void (Foo::*)(B&)>("m1", &Foo::m1)
    ;
Run Code Online (Sandbox Code Playgroud)

简单,不是吗?无需在外面投射或捕获.同样的事情对于在模块级别创建独立功能是有效的,即使用boost::python::def.


nod*_*ddy 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))
Run Code Online (Sandbox Code Playgroud)