RE: [Boost-Users] boost::polymorphic_upcast suggestion
Jean Llorca (yg-boost-users@gmane.org) wrote:
I would like to propose, in the spirit of Bjarne Stroustrup book, an upcast (where target inherits source). Upcasting is already directly supported by the language. Given classes Base and Derived, with the public inheritance implied by their names, then:
Derived d; Base * b=&d; Base & br = d; will work without any casting whatsoever. When the compiler compiles this code, it has the definitions of classes Base and Derived available, so all the work can be performed at compile time.
template
inline Target polymorphic_upcast(Source* x BOOST_EXPLICIT_DEFAULT_TARGET) { typedef unsigned int uint;
uint offset = reinterpret_cast<uint>( static_cast
assert( res == dynamic_cast<Target>(x) );
return res; } I don't understand this - how is casting a Target to an unsigned int going to help? Did you perhaps mean Target * in the above example, or have I missed something?
-- Jim
Jim,
"Jim.Hyslop"
Jean Llorca (yg-boost-users@gmane.org) wrote:
I would like to propose, in the spirit of Bjarne Stroustrup book, an upcast (where target inherits source). Upcasting is already directly supported by the language. Given classes Base
I don't understand this - how is casting a Target to an unsigned int going to help? Did you perhaps mean Target * in the above example, or have I missed something? Yes, target is a pointer type, while Source isn't. That's because of the intended usage of this function which is A* a =
Here upcasting means casting a base class to a derived class, I know it may seem strange, bust boost offers a downcast
which does the static_cast the language does implicitly already (check
On Thursday, June 27, 2002, at 06:38 AM, Jean Llorca wrote:
Here upcasting means casting a base class to a derived class, I know it may seem strange, bust boost offers a downcast which does the static_cast the language does implicitly already (check
).
I think you've got it backwards. Downcasting, in Boost at least, means casting a pointer to a base class part of an object to a pointer to a derived class part of the same object. The polymorphic_downcast is *not* doing a static_cast for a conversion the language already does implicitly. Could you give a specific complete example (a file that would compile, with all the declarations) of how one would use what you're proposing to help make this clearer? -- Darin
"Darin Adler"
On Thursday, June 27, 2002, at 06:38 AM, Jean Llorca wrote:
Here upcasting means casting a base class to a derived class, I know it may seem strange, bust boost offers a downcast which does the static_cast the language does implicitly already (check
). I think you've got it backwards. Downcasting, in Boost at least, means casting a pointer to a base class part of an object to a pointer to a derived class part of the same object. The polymorphic_downcast is *not* doing a static_cast for a conversion the language already does implicitly.
template
Could you give a specific complete example (a file that would compile, with all the declarations) of how one would use what you're proposing to help make this clearer?
I enclosed two files to this reply. Don't scream about chosen class names
and stuff in the example ;)
begin 666 test.cpp
M+R\@=&5S="YC<' @.B!$969I;F5S('1H92!E;G1R>2!P;VEN="!F;W(@=&AE
M(&-O;G-O;&4@87!P;&EC871I;VXN#0HO+PT*#0HC:6YC;'5D92 \;G%C87-T
M+F@^#0H-"@T*8VQA
Hi, I feel I have to jump on this one ;-) Jean, I think you have this one backwards I'm afraid, take your example (stripped down a bit)
-----Original Message----- From: news [mailto:news@main.gmane.org]On Behalf Of Jean Llorca Sent: 27 June 2002 15:31 To: boost-users@yahoogroups.com Subject: [Boost-Users] Re: boost::polymorphic_upcast suggestion
"Darin Adler"
a écrit dans le message de news: B586F909-89D7-11D6-9349-0003935B80A2@bentspoon.com... On Thursday, June 27, 2002, at 06:38 AM, Jean Llorca wrote:
Here upcasting means casting a base class to a derived class, I know it may seem strange, bust boost offers a downcast which does the static_cast the language does implicitly already (check
). I think you've got it backwards. Downcasting, in Boost at least, means casting a pointer to a base class part of an object to a pointer to a derived class part of the same object. The polymorphic_downcast is *not* doing a static_cast for a conversion the language already does implicitly.
template
inline Target polymorphic_downcast(Source* x BOOST_EXPLICIT_DEFAULT_TARGET) { assert( dynamic_cast<Target>(x) == x ); // detect logic error return static_cast<Target>(x); } Sorry about it, but it's here in the code. This is in the last version of the CVS. It does a static_cast. The compiler does static_cast implicitly in some cases. For instance a C++ compiler replaces the assert line with: assert( dynamic_cast<Target>(x) == static_cast<Target>(x) );
Could you give a specific complete example (a file that would compile, with all the declarations) of how one would use what you're proposing to help make this clearer?
I enclosed two files to this reply. Don't scream about chosen class names and stuff in the example ;)
participants (4)
-
Darin Adler
-
Jean Llorca
-
Jim.Hyslop
-
Sam Partington