diff --git a/cast.htm b/cast.htm index 4c7bac7..a7e55f2 100644 --- a/cast.htm +++ b/cast.htm @@ -20,9 +20,9 @@
The header boost/cast.hpp provides
- polymorphic_cast, polymorphic_downcast, and numeric_cast function templates designed to
+ polymorphic_cast
, polymorphic_downcast
, and numeric_cast
function templates designed to
complement the C++ built-in casts.
The program cast_test.cpp can be used to @@ -34,43 +34,51 @@ least one virtual function) are sometimes downcast or crosscast. Downcasting means casting from a base class to a derived class. Crosscasting means casting across an inheritance hierarchy diagram, such - as from one base to the other in a Y diagram hierarchy.
+ as from one base to the other in aY
diagram hierarchy.
Such casts can be done with old-style casts, but this approach is never to be recommended. Old-style casts are sorely lacking in type safety, suffer poor readability, and are difficult to locate with search tools.
-The C++ built-in static_cast can be used for efficiently +
The C++ built-in static_cast
can be used for efficiently
downcasting pointers to polymorphic objects, but provides no error
detection for the case where the pointer being cast actually points to
- the wrong derived class. The polymorphic_downcast template retains
- the efficiency of static_cast for non-debug compilations, but for
- debug compilations adds safety via an assert() that a dynamic_cast
+ the wrong derived class. The polymorphic_downcast
template retains
+ the efficiency of static_cast
for non-debug compilations, but for
+ debug compilations adds safety via an assert() that a dynamic_cast
succeeds.
The C++ built-in dynamic_cast can be used for downcasts and +
The C++ built-in dynamic_cast
can be used for downcasts and
crosscasts of pointers to polymorphic objects, but error notification in
the form of a returned value of 0 is inconvenient to test, or worse yet,
- easy to forget to test. The throwing form of dynamic_cast, which
+ easy to forget to test. The throwing form of dynamic_cast
, which
works on references, can be used on pointers through the ugly expression
&dynamic_cast<T&>(*p)
, which causes undefined
- behavior if p
is 0
. The polymorphic_cast
- template performs a dynamic_cast on a pointer, and throws an
- exception if the dynamic_cast returns 0.
p
is 0
. The polymorphic_cast
+ template performs a dynamic_cast
on a pointer, and throws an
+ exception if the dynamic_cast
returns 0.
- A polymorphic_downcast is preferred when debug-mode tests will - cover 100% of the object types possibly cast and when non-debug-mode - efficiency is an issue. If these two conditions are not present, - polymorphic_cast is preferred. It must also be used for - crosscasts. It does an assert( dynamic_cast<Derived>(x) == x ) - where x is the base pointer, ensuring that not only is a non-zero pointer - returned, but also that it correct in the presence of multiple - inheritance. Warning:: Because polymorphic_downcast uses - assert(), it violates the one definition rule (ODR) if NDEBUG is - inconsistently defined across translation units. [See ISO Std 3.2]
+A polymorphic_downcast
should be used for
+ downcasts that you are certain should succeed. Error checking is
+ only performed in translation units where NDEBUG
is
+ not defined, via
+
+ assert( dynamic_cast<Derived>(x) == x ) +where
x
is the source pointer. This approach
+ ensures that not only is a non-zero pointer returned, but also
+ that it is correct in the presence of multiple inheritance.
+ Attempts to crosscast using polymorphic_downcast
will
+ fail to compile.
+ Warning: Because polymorphic_downcast
uses assert(), it
+ violates the One Definition Rule (ODR) if NDEBUG is inconsistently
+ defined across translation units. [See ISO Std 3.2]
+
+ For crosscasts, or when the success of a cast can only be known at
+ runtime, or when efficiency is not important,
+ polymorphic_cast
is preferred.
The C++ built-in dynamic_cast must be used to cast references +
The C++ built-in dynamic_cast
must be used to cast references
rather than pointers. It is also the only cast that can be used to check
whether a given interface is supported; in that case a return of 0 isn't
an error condition.
A static_cast or implicit conversion will not detect failure to - preserve range for numeric casts. The numeric_cast function - templates are similar to static_cast and certain (dubious) +
A static_cast
or implicit conversion will not detect failure to
+ preserve range for numeric casts. The numeric_cast
function
+ templates are similar to static_cast
and certain (dubious)
implicit conversions in this respect, except that they detect loss of
numeric range. An exception is thrown when a runtime value-preservation
check fails.
static_cast
.
@@ -178,11 +186,11 @@ void ariane(double vx)
polymorphic_cast was suggested by Bjarne Stroustrup in "The C++ +
polymorphic_cast
was suggested by Bjarne Stroustrup in "The C++
Programming Language".
- polymorphic_downcast was contributed by Dave Abrahams.
- numeric_cast was contributed by polymorphic_downcast was contributed by Dave Abrahams.
was contributed by Kevlin Henney.
+ numeric_cast