forked from boostorg/conversion
New casts for smart pointers.
[SVN r12743]
This commit is contained in:
29
cast.htm
29
cast.htm
@@ -1,3 +1,5 @@
|
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
<html>
|
<html>
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
@@ -9,46 +11,49 @@
|
|||||||
|
|
||||||
<body bgcolor="#FFFFFF" text="#000000">
|
<body bgcolor="#FFFFFF" text="#000000">
|
||||||
|
|
||||||
<h1><img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align="center" width="277" height="86">Header
|
<h1><img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align="middle" width="277" height="86">Header
|
||||||
<a href="../../boost/cast.hpp">boost/cast.hpp</a></h1>
|
<a href="../../boost/cast.hpp">boost/cast.hpp</a></h1>
|
||||||
|
|
||||||
<h2><a name="Cast Functions">Cast Functions</a></h2>
|
<h2><a name="Cast Functions">Cast Functions</a></h2>
|
||||||
<p>The <code>header <a href="../../boost/cast.hpp">boost/cast.hpp</a></code>
|
|
||||||
|
<p>The header <a href="../../boost/cast.hpp">boost/cast.hpp</a>
|
||||||
provides <a href="#Polymorphic_cast"><b>polymorphic_cast</b></a>, <a href="#Polymorphic_cast"><b>polymorphic_downcast</b></a>,
|
provides <a href="#Polymorphic_cast"><b>polymorphic_cast</b></a>, <a href="#Polymorphic_cast"><b>polymorphic_downcast</b></a>,
|
||||||
and <a href="#numeric_cast"><b>numeric_cast</b></a> function templates designed
|
and <a href="#numeric_cast"><b>numeric_cast</b></a> function templates designed
|
||||||
to complement the C++ built-in casts.</p>
|
to complement the C++ built-in casts.</p>
|
||||||
<p>The program <a href="cast_test.cpp">cast_test.cpp</a> can be used to
|
|
||||||
|
<p>The program <a href="cast_test.cpp">cast_test.cpp</a> can be used to
|
||||||
verify these function templates work as expected.</p>
|
verify these function templates work as expected.</p>
|
||||||
<h3><a name="Polymorphic_cast">Polymorphic casts</a></h3>
|
<h3><a name="Polymorphic_cast">Polymorphic casts</a></h3>
|
||||||
<p>Pointers to polymorphic objects (objects of classes which define at least one
|
<p>Pointers to polymorphic objects (objects of classes which define at least one
|
||||||
virtual function) are sometimes downcast or crosscast. Downcasting means
|
virtual function) are sometimes downcast or crosscast. Downcasting means
|
||||||
casting from a base class to a derived class. Crosscasting means casting
|
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
|
across an inheritance hierarchy diagram, such as from one base to the other in a
|
||||||
<b>Y</b> diagram hierarchy.</p>
|
<b>Y</b> diagram hierarchy.</p>
|
||||||
<p>Such casts can be done with old-style casts, but this approach is never to be
|
<p>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
|
recommended. Old-style casts are sorely lacking in type safety, suffer
|
||||||
poor readability, and are difficult to locate with search tools.</p>
|
poor readability, and are difficult to locate with search tools.</p>
|
||||||
<p>The C++ built-in <b>static_cast</b> can be used for efficiently downcasting
|
<p>The C++ built-in <b>static_cast</b> can be used for efficiently downcasting
|
||||||
pointers to polymorphic objects, but provides no error detection for the case
|
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 <b>polymorphic_downcast</b>
|
where the pointer being cast actually points to the wrong derived class. The <b>polymorphic_downcast</b>
|
||||||
template retains the efficiency of <b>static_cast</b> for non-debug
|
template retains the efficiency of <b>static_cast</b> for non-debug
|
||||||
compilations, but for debug compilations adds safety via an assert() that a <b>dynamic_cast</b>
|
compilations, but for debug compilations adds safety via an assert() that a <b>dynamic_cast</b>
|
||||||
succeeds. <b> </b></p>
|
succeeds.</p>
|
||||||
<p>The C++ built-in <b>dynamic_cast</b> can be used for downcasts and crosscasts
|
<p>The C++ built-in <b>dynamic_cast</b> can be used for downcasts and crosscasts
|
||||||
of pointers to polymorphic objects, but error notification in the form of a
|
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
|
returned value of 0 is inconvenient to test, or worse yet, easy to forget to
|
||||||
test. The <b>polymorphic_cast</b> template performs a <b>dynamic_cast</b>,
|
test. The <b>polymorphic_cast</b> template performs a <b>dynamic_cast</b>,
|
||||||
and throws an exception if the <b>dynamic_cast</b> returns 0.</p>
|
and throws an exception if the <b>dynamic_cast</b> returns 0.</p>
|
||||||
<p>A <b>polymorphic_downcast</b> is preferred when debug-mode tests will cover
|
<p>A <b>polymorphic_downcast</b> is preferred when debug-mode tests will cover
|
||||||
100% of the object types possibly cast and when non-debug-mode efficiency is an
|
100% of the object types possibly cast and when non-debug-mode efficiency is an
|
||||||
issue. If these two conditions are not present, <b>polymorphic_cast</b> is
|
issue. If these two conditions are not present, <b>polymorphic_cast</b> is
|
||||||
preferred. It must also be used for crosscasts. It does an assert(
|
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
|
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
|
not only is a non-zero pointer returned, but also that it correct in the
|
||||||
presence of multiple inheritance.<b> Warning:</b>: Because <b>polymorphic_downcast</b>
|
presence of multiple inheritance.<b> Warning:</b>: Because <b>polymorphic_downcast</b>
|
||||||
uses assert(), it violates the one definition rule (ODR) if NDEBUG is inconsistently
|
uses assert(), it violates the one definition rule (ODR) if NDEBUG is inconsistently
|
||||||
defined across translation units. [See ISO Std 3.2]</p>
|
defined across translation units. [See ISO Std 3.2]</p>
|
||||||
<p>The C++ built-in <b>dynamic_cast</b> must be used to cast references rather
|
<p>The C++ built-in <b>dynamic_cast</b> must be used to cast references rather
|
||||||
than pointers. It is also the only cast that can be used to check whether
|
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
|
a given interface is supported; in that case a return of 0 isn't an error
|
||||||
condition.</p>
|
condition.</p>
|
||||||
<h3>polymorphic_cast and polymorphic_downcast synopsis</h3>
|
<h3>polymorphic_cast and polymorphic_downcast synopsis</h3>
|
||||||
@@ -132,7 +137,7 @@ Abrahams</a>.<b><br>
|
|||||||
numeric_cast</b> was contributed by <a href="../../people/kevlin_henney.htm">Kevlin
|
numeric_cast</b> was contributed by <a href="../../people/kevlin_henney.htm">Kevlin
|
||||||
Henney</a>.</p>
|
Henney</a>.</p>
|
||||||
<hr>
|
<hr>
|
||||||
<p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan
|
<p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan
|
||||||
-->06 January, 2001<!--webbot bot="Timestamp" endspan i-checksum="38320"
|
-->06 January, 2001<!--webbot bot="Timestamp" endspan i-checksum="38320"
|
||||||
--></p>
|
--></p>
|
||||||
<p><EFBFBD> Copyright boost.org 1999. Permission to copy, use, modify, sell and
|
<p><EFBFBD> Copyright boost.org 1999. Permission to copy, use, modify, sell and
|
||||||
|
Reference in New Issue
Block a user