Coup de pouce.Python - Comment retourner par référence?

Je suis d'utilisation de Boost.Python pour créer des modules Python de classes C++. Et j'ai rencontré un problème avec les références.

Condider le cas suivant où j'ai une classe Foo avec surchargé obtenir des méthodes qui peuvent soit retour par valeur ou par référence.

Précisant que la déclaration de valeur doit être utilisée était facile une fois que j'ai typedefed une signature. Mais je pense qu'il devrait être possible de retourner une référence aussi bien à l'aide d'un return_value_policy. Cependant, en utilisant ce qui me semblait approprié (doc); return_value_policy<reference_existing_object> n'a pas l'air de fonctionner.

Ai-je mal compris ce qu'il fait?

struct Foo {
    Foo(float x) { _x = x; }
    float& get() { return _x; }
    float  get() const { return _x; }
private:
    float _x;
};

//Wrapper code
BOOST_PYTHON_MODULE(my_module)
{
    using namespace boost::python;
    typedef float (Foo::*get_by_value)() const;
    typedef float& (Foo::*get_by_ref)();

    class_<Foo>("Foo", init<float>())
        .def("get", get_by_value(&Foo::get))
        .def("get_ref", get_by_ref(&Foo::get),
            return_value_policy<reference_existing_object>())//Doesn't work
        ;
}

Note: je sais que ça pourrait être dangereux pour faire référence à un objet existant sans vie de gestion de temps.

Mise à jour:
On dirait qu'il travaille pour les objets mais pas les types de données de base.
Prenez cet exemple révisé:

struct Foo {
    Foo(float x) { _x = x; }
    float& get() { return _x; }
    float  get() const { return _x; }
    void set( float f ){ _x = f;}
    Foo& self(){return *this;}
private:
    float _x;
};

//Wrapper code
using namespace boost::python;
BOOST_PYTHON_MODULE(my_module)
{
    typedef float (Foo::*get_by_value)() const;

    class_<Foo>("Foo", init<float>())
        .def("get", get_by_value(&Foo::get))
        .def("get_self", &Foo::self,
            return_value_policy<reference_existing_object>())
        .def("set", &Foo::set);
        ;
}

Qui, dans un essai donné le résultat attendu:

>>> foo1 = Foo(123)
>>> foo1.get()
123.0
>>> foo2 = foo1.get_self()
>>> foo2.set(1)
>>> foo1.get()
1.0
>>> id(foo1) == id(foo2)
False

OriginalL'auteur mandrake | 2009-10-15