簡體   English   中英

boost-python在重載方法之間進行選擇

[英]boost-python select between overloaded methods

假設存在一些具有兩個重載方法的類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)

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

只是為了完成,它們也可以在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)

雖然其他答案是正確的,但不需要使用臨時變量或static_cast進行任何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)
    ;

簡單,不是嗎? 無需在外面投射或捕獲。 同樣的事情對於在模塊級創建獨立功能是有效的,即使用boost::python::def

您可以使用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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM