[C++-sig] Boost Python objects and object identity

Renato Araujo renatox at gmail.com
Tue Sep 29 20:42:39 CEST 2009


Hi Pertti

I had the same problem as you in my binding implementation, then I
solve the problem using this function:

//
// a generator with an execute() function which, given a source type
// and a pointer to an object of that type, returns its most-derived
// /reachable/ type identifier and object pointer.
//

// first, the case where T has virtual functions
template <class T>
struct polymorphic_id_generator
{
    static dynamic_id_t execute(void* p_)
    {
        T* p = static_cast<T*>(p_);
        return std::make_pair(dynamic_cast<void*>(p), class_id(typeid(*p)));
    }
};

I use this function to get a pointer to most-derived type and use this
as key in my hash table.


BR
Renato Araujo Oliveira Filho




2009/9/29 Pertti Kellomäki <pertti.kellomaki at tut.fi>:
> I have Python bindings for a C++ library that among other
> things contains classes for describing the static structure
> of a microprocessor.
>
> My background is in Lisp, so I am used to using object
> identities (references) as keys. The C++ library can
> be used in this fashion, e.g. looking up a register file
> by name always returns the same object reference.
> However, the C++ to Python mapping does not preserve object
> identity, as a new Python object is created for every query,
> even if the underlying C++ reference is the same.
>
> Is there any easy way to preserve object identity in this
> sense with Boost Python? My first thought was to use some
> kind of caching scheme so that consequent queries with a
> particular name return the same object, but the problem is
> that objects are not only looked up by name, they can also
> be returned e.g. by asking for a parent object in a containment
> hierarchy.
> --
> Pertti
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig
>


More information about the Cplusplus-sig mailing list