2010-02-27 3 views
1

J'ai une classe en C++ que je ne peux pas modifier. Cependant, cette classe contient un std:: list > d'éléments dont j'ai besoin pour accéder à une extension Python. Puisque Boost :: Python ne semble pas avoir de conversion intégrée entre une liste std :: list et une liste Python, j'espérais pouvoir écrire une méthode en C++ qui pourrait faire cette conversion pour moi et plus tard, quand Je suis en train de mapper les classes C++ aux classes Python, je pourrais attacher cette méthode.Comment utiliser Boost :: Python pour ajouter une méthode à une classe exportée sans modifier la classe de base?

Je préférerais si je pouvais appeler la méthode comme

baseClassInstance.get_std_list_of_items_as_python_list() 

Répondre

1

Boost fournit une aide pour envelopper itérateurs qui est documenté ici: http://www.boost.org/doc/libs/1_42_0/libs/python/doc/v2/iterator.html

L'exemple entendre la fin de cette page a fonctionné pour moi , il vous suffit de créer explicitement la conversion, par exemple:

class_<std::list<Item> >("ItemList") 
    .def("__iter__", iterator<std::list<Item> >()); 

pour modifier la classe C++ sans le changer, je suis l'habitude de creati ng une enveloppe fine qui sous-classe la classe réelle. Cela fait un bon endroit pour séparer tout le crud qui rend mes objets C++ à l'aise avec Python.

class Py_BaseClass : public BaseClass { 
    public: 
    std::list<Item> & py_get_items(); 
    } 
3

Pour répondre à la question d'une manière plus générale, vous pouvez attacher une fonction C++ qui a la signature droit à l'exportation de python dans la déclaration de class_.

Supposons une classe foo:

struct foo 
{ 
    //class stuff here 
} 

Vous pouvez définir une fonction libre qui prend une référence à foo comme premier argument:

int do_things_to_a_foo(foo& self, int a, std::string b, other_type c) 
{ 
    //Do things to self 
} 

et l'exporter comme un membre de foo:

class_<foo>("foo") 
    ... 
    .def("do_things_to_a_foo", &do_things_to_a_foo) 
    ... 
    ; 
Questions connexes