Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_33_1/libs/iterator/doc/pointee.rst @ 12

Last change on this file since 12 was 12, checked in by landauf, 17 years ago

added boost

  • Property svn:executable set to *
File size: 2.3 KB

pointee and indirect_reference

Author: David Abrahams
Contact: dave@boost-consulting.com
Organization: Boost Consulting
Date: 2005-02-27
Copyright: Copyright David Abrahams 2004.
abstract:Provides the capability to deduce the referent types of pointers, smart pointers and iterators in generic code.

Overview

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":

template <class Dereferenceable>
void f(Dereferenceable p)
{
    what-goes-here? value = *p;
    ...
}

pointee

It turns out to be impossible to come up with a fully-general algorithm to do determine what-goes-here directly, but it is possible to require that pointee<Dereferenceable>::type is correct. Naturally, pointee has the same difficulty: it can't determine the appropriate ::type reliably for all Dereferenceables, 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 necessary:

namespace boost
{
  template <class T>
  struct pointee<third_party_lib::smart_pointer<T> >
  {
      typedef T type;
  };
}

indirect_reference

indirect_reference<T>::type is rather more specialized than pointee, 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 indirect_reference.

Both of these templates are essential to the correct functioning of indirect_iterator.

Reference

pointee

?
.. include:: pointee_ref.rst

indirect_reference

?
.. include:: indirect_reference_ref.rst
Note: See TracBrowser for help on using the repository browser.