From: William S F. <ws...@fu...> - 2007-03-28 22:52:20
|
Josh Cherry wrote: > > > On Wed, 28 Mar 2007, William S Fulton wrote: > >> Your only solution right now is to use RTTI as Josh mentioned: >> >> %extend Base { >> virtual const char *__str__() const >> { >> if (dynamic_cast<const Derived2 *>($self)) >> return "I'm Derived2 class"; >> else if (dynamic_cast<const Derived1 *>($self)) >> return "I'm Derived1 class"; >> else if (dynamic_cast<const Base *>($self)) >> return "I'm Base class"; >> } >> } > > I had in mind grabbing typeid($self).name(), which, on the platforms > I've looked at (Linux/gcc and Windows/msvc), has the class name embedded > in it (in different ways). That way there's no need even to know the > classes in advance. In fact I think it should be possible to wrap the > rtti stuff so that this can be applied in Python to any polymorphic class. > Many moons ago when I used that approach, I found different manglings in the names returned by each different compiler. I just checked the C++ standard and it says that std::type_info::name() returns an implementation defined NTBS (null terminated byte string). So the standard allows for the inconsistent behaviour I've noticed across compilers. William |