2011-09-28 14 views
17

Załóżmy, istnieją pewne klasy Foo z dwóch przeciążonych metod:doładowania pyton wybrać między przeciążonych metod

class Foo 
{ 
    ... 
    void m1(A& a); 
    void m1(B& b); 

muszę wystawiać jedną z tych metod ponad boost-python:

boost::python::class_<Foo>("Foo") 
    .def("m1", &Foo::m1) 

Jak należy określić że podpis m1(A&a) powinien być stosowany przez m1(B&b)

Odpowiedz

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

Tylko na zakończenie, możliwe jest również, aby mieć oboje narażone na stronie Pythona:

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

Można użyć static_cast aby określić podpis w użyciu. Ta metoda nie wymaga tworzenia nazwanego wskaźnika funkcji, przy jednoczesnym zachowaniu rozdzielczości przeciążania w kontekście pojedynczej linii.

boost::python::class_<Foo>("Foo") 
    .def("m1", static_cast<void (Foo::*)(A&)>(&Foo::m1)) 
    .def("m1", static_cast<void (Foo::*)(B&)>(&Foo::m1)) 
Powiązane problemy