2.4 KiB
pointee and
indirect_reference
- Author
- David Abrahams
- Contact
- dave@boost-consulting.com
- organization
- Boost Consulting
- 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.