2004-01-13 23:03:18 +00:00
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en" lang = "en" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" />
< meta name = "generator" content = "Docutils 0.3.1: http://docutils.sourceforge.net/" />
< title > pointee and indirect_reference</ title >
< meta name = "author" content = "David Abrahams" />
< meta name = "organization" content = "Boost Consulting" />
< meta name = "date" content = "2004-01-13" />
< meta name = "copyright" content = "Copyright David Abrahams 2004. All rights reserved" />
< link rel = "stylesheet" href = "default.css" type = "text/css" />
</ head >
< body >
< div class = "document" id = "pointee-and-indirect-reference" >
< h1 class = "title" >< tt class = "literal" >< span class = "pre" > pointee</ span ></ tt > and < tt class = "literal" >< span class = "pre" > indirect_reference</ span ></ tt ></ h1 >
< table class = "docinfo" frame = "void" rules = "none" >
< col class = "docinfo-name" />
< col class = "docinfo-content" />
< tbody valign = "top" >
< tr >< th class = "docinfo-name" > Author:</ th >
< td > David Abrahams</ td ></ tr >
< tr >< th class = "docinfo-name" > Contact:</ th >
< td >< a class = "first reference" href = "mailto:dave@boost-consulting.com" > dave@ boost-consulting.com</ a > , < a class = "reference" href = "mailto:jsiek@osl.iu.edu" > jsiek@ osl.iu.edu</ a > , < a class = "last reference" href = "mailto:witt@ive.uni-hannover.de" > witt@ ive.uni-hannover.de</ a ></ td ></ tr >
< tr >< th class = "docinfo-name" > Organization:</ th >
< td >< a class = "first last reference" href = "http://www.boost-consulting.com" > Boost Consulting</ a ></ td ></ tr >
< tr >< th class = "docinfo-name" > Date:</ th >
< td > 2004-01-13</ td ></ tr >
< tr >< th class = "docinfo-name" > Copyright:</ th >
< td > Copyright David Abrahams 2004. All rights reserved</ td ></ tr >
</ tbody >
</ table >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" />
< col class = "field-body" />
< tbody valign = "top" >
< tr class = "field" >< th class = "field-name" > abstract:</ th >< td class = "field-body" > Provides the capability to deduce the referent types of
pointers, smart pointers and iterators in generic code.</ td >
</ tr >
</ tbody >
</ table >
< div class = "section" id = "overview" >
< h1 >< a name = "overview" > Overview</ a ></ h1 >
< p > Have you ever wanted to write a generic function that can operate
on any kind of dereferenceable object? If you have, you've
probably run into the problem of how to determine the type that the
object " points at" :</ p >
< pre class = "literal-block" >
template < class Dereferenceable>
void f(Dereferenceable p)
{
< em > what-goes-here?</ em > value = *p;
...
}
</ pre >
< div class = "section" id = "pointee" >
< h2 >< a name = "pointee" >< tt class = "literal" >< span class = "pre" > pointee</ span ></ tt ></ a ></ h2 >
< p > It turns out to be impossible to come up with a fully-general
algorithm to do determine < em > what-goes-here</ em > directly, but it is
possible to require that < tt class = "literal" >< span class = "pre" > pointee< Dereferenceable> ::type</ span ></ tt > is
correct. Naturally, < tt class = "literal" >< span class = "pre" > pointee</ span ></ tt > has the same difficulty: it can't
determine the appropriate < tt class = "literal" >< span class = "pre" > ::type</ span ></ tt > reliably for all
< tt class = "literal" >< span class = "pre" > Dereferenceable</ span ></ tt > s, but it makes very good guesses (it works
for all pointers, standard and boost smart pointers, and
iterators), and when it guesses wrongly, it can be specialized as
neccessary:</ p >
< pre class = "literal-block" >
namespace boost
{
template < class T>
struct pointee< third_party_lib::smart_pointer< T> >
{
typedef T type;
};
}
</ pre >
</ div >
< div class = "section" id = "indirect-reference" >
< h2 >< a name = "indirect-reference" >< tt class = "literal" >< span class = "pre" > indirect_reference</ span ></ tt ></ a ></ h2 >
< p >< tt class = "literal" >< span class = "pre" > indirect_reference< T> ::type</ span ></ tt > is rather more specialized than
< tt class = "literal" >< span class = "pre" > pointee</ span ></ tt > , and is meant to be used to forward the result of
dereferencing an object of its argument type. Most dereferenceable
types just return a reference to their pointee, but some return
proxy references or return the pointee by value. When that
information is needed, call on < tt class = "literal" >< span class = "pre" > indirect_reference</ span ></ tt > .</ p >
< p > Both of these templates are essential to the correct functioning of
< a class = "reference" href = "indirect_iterator.html" >< tt class = "literal" >< span class = "pre" > indirect_iterator</ span ></ tt ></ a > .</ p >
</ div >
</ div >
< div class = "section" id = "reference" >
< h1 >< a name = "reference" > Reference</ a ></ h1 >
< div class = "section" id = "id1" >
< h2 >< a name = "id1" >< tt class = "literal" >< span class = "pre" > pointee</ span ></ tt ></ a ></ h2 >
<!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
<!-- subject to the Boost Software License, Version 1.0. (See accompanying -->
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
< pre class = "literal-block" >
template < class Dereferenceable>
struct pointee
{
typedef /* see below */ type;
};
</ pre >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" />
< col class = "field-body" />
< tbody valign = "top" >
< tr class = "field" >< th class = "field-name" > Requires:</ th >< td class = "field-body" > For an object < tt class = "literal" >< span class = "pre" > x</ span ></ tt > of type < tt class = "literal" >< span class = "pre" > Dereferenceable</ span ></ tt > , < tt class = "literal" >< span class = "pre" > *x</ span ></ tt >
is well-formed. If < tt class = "literal" >< span class = "pre" > ++x</ span ></ tt > is ill-formed it shall neither be
ambiguous nor shall it violate access control, and
< tt class = "literal" >< span class = "pre" > Dereferenceable::element_type</ span ></ tt > shall be an accessible type.
Otherwise < tt class = "literal" >< span class = "pre" > iterator_traits< Dereferenceable> ::value_type</ span ></ tt > shall
be well formed. [Note: These requirements need not apply to
explicit or partial specializations of < tt class = "literal" >< span class = "pre" > pointee</ span ></ tt > ]</ td >
</ tr >
</ tbody >
</ table >
< p >< tt class = "literal" >< span class = "pre" > type</ span ></ tt > is determined according to the following algorithm, where
< tt class = "literal" >< span class = "pre" > x</ span ></ tt > is an object of type < tt class = "literal" >< span class = "pre" > Dereferenceable</ span ></ tt > :</ p >
< pre class = "literal-block" >
if ( ++x is ill-formed )
{
return ``Dereferenceable::element_type``
}
else if (``*x`` is a mutable reference to
std::iterator_traits< Dereferenceable> ::value_type)
{
return iterator_traits< Dereferenceable> ::value_type
}
else
{
return iterator_traits< Dereferenceable> ::value_type const
}
</ pre >
</ div >
< div class = "section" id = "id2" >
< h2 >< a name = "id2" >< tt class = "literal" >< span class = "pre" > indirect_reference</ span ></ tt ></ a ></ h2 >
<!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
<!-- subject to the Boost Software License, Version 1.0. (See accompanying -->
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
< pre class = "literal-block" >
template < class Dereferenceable>
struct indirect_reference
{
typedef /* see below */ type;
};
</ pre >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" />
< col class = "field-body" />
< tbody valign = "top" >
< tr class = "field" >< th class = "field-name" > Requires:</ th >< td class = "field-body" > For an object < tt class = "literal" >< span class = "pre" > x</ span ></ tt > of type < tt class = "literal" >< span class = "pre" > Dereferenceable</ span ></ tt > , < tt class = "literal" >< span class = "pre" > *x</ span ></ tt >
is well-formed. If < tt class = "literal" >< span class = "pre" > ++x</ span ></ tt > is ill-formed it shall neither be
ambiguous nor shall it violate access control, and
< tt class = "literal" >< span class = "pre" > pointee< Dereferenceable> ::type& </ span ></ tt > shall be well-formed.
Otherwise < tt class = "literal" >< span class = "pre" > iterator_traits< Dereferenceable> ::reference</ span ></ tt > shall
be well formed. [Note: These requirements need not apply to
explicit or partial specializations of < tt class = "literal" >< span class = "pre" > indirect_reference</ span ></ tt > ]</ td >
</ tr >
</ tbody >
</ table >
< p >< tt class = "literal" >< span class = "pre" > type</ span ></ tt > is determined according to the following algorithm, where
< tt class = "literal" >< span class = "pre" > x</ span ></ tt > is an object of type < tt class = "literal" >< span class = "pre" > Dereferenceable</ span ></ tt > :</ p >
< pre class = "literal-block" >
if ( ++x is ill-formed )
return ``pointee< Dereferenceable> ::type& ``
else
2004-01-14 04:48:53 +00:00
std::iterator_traits< Dereferenceable> ::reference
2004-01-13 23:03:18 +00:00
</ pre >
</ div >
</ div >
</ div >
< hr class = "footer" />
< div class = "footer" >
< a class = "reference" href = "pointee.rst" > View document source</ a > .
Generated by < a class = "reference" href = "http://docutils.sourceforge.net/" > Docutils</ a > from < a class = "reference" href = "http://docutils.sourceforge.net/rst.html" > reStructuredText</ a > source.
</ div >
</ body >
</ html >