mirror of
https://github.com/boostorg/utility.git
synced 2025-05-08 18:34:02 +00:00
311 lines
14 KiB
HTML
311 lines
14 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<title>Header boost/utility.hpp Documentation</title>
|
|
</head>
|
|
<body bgcolor="#FFFFFF" text="#000000">
|
|
<h1><img src="../../boost.png" alt="boost.png (6897 bytes)" align="center" WIDTH="277" HEIGHT="86">Header
|
|
<a href="../../boost/utility.hpp">boost/utility.hpp</a></h1>
|
|
<p>The entire contents of the header <code><a href="../../boost/utility.hpp"><boost/utility.hpp></a></code>
|
|
are in <code>namespace boost</code>.</p>
|
|
<h2>Contents</h2>
|
|
<ul>
|
|
<li>
|
|
Class templates supporting the <a href="base_from_member.html">base-from-member
|
|
idiom</a></li>
|
|
<li>
|
|
Function templates <a href="#checked_delete">checked_delete() and
|
|
checked_array_delete()</a></li>
|
|
<li>
|
|
Function templates <a href="#functions_next_prior">next() and prior()</a></li>
|
|
<li>
|
|
Class <a href="#Class_noncopyable">noncopyable</a></li>
|
|
<li>
|
|
Function template <a href="#addressof">addressof()</a></li>
|
|
<li>Class template <a href="#result_of">result_of</a></li>
|
|
<li>
|
|
Macro <a href="#BOOST_BINARY">BOOST_BINARY</a></li>
|
|
<li><a href="index.html">Other utilities not part of <code>utility.hpp</code></a></li>
|
|
</ul>
|
|
<h2>
|
|
Function templates <a name="checked_delete">checked_delete</a>() and
|
|
checked_array_delete()</h2>
|
|
<p>See <a href="checked_delete.html">separate documentation</a>.</p>
|
|
<h2>
|
|
<a name="functions_next_prior">Function</a> templates next() and prior()</h2>
|
|
<p>Certain data types, such as the C++ Standard Library's forward and bidirectional
|
|
iterators, do not provide addition and subtraction via operator+() or
|
|
operator-(). This means that non-modifying computation of the next or
|
|
prior value requires a temporary, even though operator++() or operator--() is
|
|
provided. It also means that writing code like <code>itr+1</code> inside
|
|
a template restricts the iterator category to random access iterators.</p>
|
|
<p>The next() and prior() functions provide a simple way around these problems:</p>
|
|
<blockquote>
|
|
<pre>template <class T>
|
|
T next(T x) { return ++x; }
|
|
|
|
template <class T, class Distance>
|
|
T next(T x, Distance n)
|
|
{
|
|
std::advance(x, n);
|
|
return x;
|
|
}
|
|
|
|
template <class T>
|
|
T prior(T x) { return --x; }
|
|
|
|
template <class T, class Distance>
|
|
T prior(T x, Distance n)
|
|
{
|
|
std::advance(x, -n);
|
|
return x;
|
|
}</pre>
|
|
</blockquote>
|
|
<p>Usage is simple:</p>
|
|
<blockquote>
|
|
<pre>const std::list<T>::iterator p = get_some_iterator();
|
|
const std::list<T>::iterator prev = boost::prior(p);
|
|
const std::list<T>::iterator next = boost::next(prev, 2);</pre>
|
|
</blockquote>
|
|
<p>The distance from the given iterator should be supplied as an absolute value. For
|
|
example, the iterator four iterators prior to the given iterator <code>p</code>
|
|
may be obtained by <code>prior(p, 4)</code>.</p>
|
|
<p>Contributed by <a href="http://www.boost.org/people/dave_abrahams.htm">Dave Abrahams</a>. Two-argument versions by Daniel Walker.</p>
|
|
<h2><a name="Class_noncopyable">Class noncopyable</a></h2>
|
|
<p>Class <strong>noncopyable</strong> is a base class. Derive your own class
|
|
from <strong>noncopyable</strong> when you want to prohibit copy construction
|
|
and copy assignment.</p>
|
|
<p>Some objects, particularly those which hold complex resources like files or
|
|
network connections, have no sensible copy semantics. Sometimes there are
|
|
possible copy semantics, but these would be of very limited usefulness and be
|
|
very difficult to implement correctly. Sometimes you're implementing a
|
|
class that doesn't need to be copied just yet and you don't want to take the
|
|
time to write the appropriate functions. Deriving from <b>noncopyable</b>
|
|
will prevent the otherwise implicitly-generated functions (which don't have the
|
|
proper semantics) from becoming a trap for other programmers.</p>
|
|
<p>The traditional way to deal with these is to declare a private copy constructor
|
|
and copy assignment, and then document why this is done. But deriving
|
|
from <b>noncopyable</b> is simpler and clearer, and doesn't require additional
|
|
documentation.</p>
|
|
<p>The program <a href="noncopyable_test.cpp">noncopyable_test.cpp</a> can be used
|
|
to verify class <b>noncopyable</b> works as expected. It has have been run
|
|
successfully under GCC 2.95, Metrowerks CodeWarrior 5.0, and Microsoft Visual
|
|
C++ 6.0 sp 3.</p>
|
|
<p>Contributed by <a href="http://www.boost.org/people/dave_abrahams.htm">Dave Abrahams</a>.</p>
|
|
<h3>Example</h3>
|
|
<blockquote>
|
|
<pre>// inside one of your own headers ...
|
|
#include <boost/utility.hpp>
|
|
|
|
class ResourceLadenFileSystem : boost::noncopyable {
|
|
...</pre>
|
|
</blockquote>
|
|
<h3>Rationale</h3>
|
|
<p>Class noncopyable has protected constructor and destructor members to emphasize
|
|
that it is to be used only as a base class. Dave Abrahams notes concern
|
|
about the effect on compiler optimization of adding (even trivial inline)
|
|
destructor declarations. He says "Probably this concern is misplaced,
|
|
because noncopyable will be used mostly for classes which own resources and
|
|
thus have non-trivial destruction semantics."</p>
|
|
<h2><a name="addressof">Function template addressof()</a></h2>
|
|
<p>Function <strong>addressof()</strong> returns the address of an object.</p>
|
|
<blockquote>
|
|
<pre>template <typename T> inline T* addressof(T& v);
|
|
template <typename T> inline const T* addressof(const T& v);
|
|
template <typename T> inline volatile T* addressof(volatile T& v);
|
|
template <typename T> inline const volatile T* addressof(const volatile T& v);
|
|
</pre>
|
|
</blockquote>
|
|
<p>C++ allows programmers to replace the unary <strong>operator&()</strong> class
|
|
member used to get the address of an object. Getting the real address of an
|
|
object requires ugly casting tricks to avoid invoking the overloaded <strong>operator&()</strong>.
|
|
Function <strong>addressof()</strong> provides a wrapper around the necessary
|
|
code to make it easy to get an object's real address.
|
|
</p>
|
|
<p>The program <a href="addressof_test.cpp">addressof_test.cpp</a> can be used to
|
|
verify that <b>addressof()</b> works as expected.</p>
|
|
<p>Contributed by Brad King based on ideas from discussion with Doug Gregor.</p>
|
|
<h3>Example</h3>
|
|
<blockquote>
|
|
<pre>#include <boost/utility.hpp>
|
|
|
|
struct useless_type {};
|
|
class nonaddressable {
|
|
useless_type operator&() const;
|
|
};
|
|
|
|
void f() {
|
|
nonaddressable x;
|
|
nonaddressable* xp = boost::addressof(x);
|
|
// nonaddressable* xpe = &x; /* error */
|
|
}</pre>
|
|
</blockquote>
|
|
<h2><a name="result_of">Class template
|
|
result_of</a></h2> <p>The class template
|
|
<code>result_of</code> helps determine the type of a
|
|
call expression. Given an lvalue <code>f</code> of
|
|
type <code>F</code> and lvalues <code>t1</code>,
|
|
<code>t2</code>, ..., <code>t<em>N</em></code> of
|
|
types <code>T1</code>, <code>T2</code>, ...,
|
|
<code>T<em>N</em></code>, respectively, the type
|
|
<code>result_of<F(T1, T2, ...,
|
|
T<em>N</em>)>::type</code> defines the result type
|
|
of the expression <code>f(t1, t2,
|
|
...,t<em>N</em>)</code>. This implementation permits
|
|
the type <code>F</code> to be a function pointer,
|
|
function reference, member function pointer, or class
|
|
type. By default, <em>N</em> may be any value between 0 and
|
|
10. To change the upper limit, define the macro
|
|
<code>BOOST_RESULT_OF_NUM_ARGS</code> to the maximum
|
|
value for <em>N</em>. Class template <code>result_of</code>
|
|
resides in the header <code><<a
|
|
href="../../boost/utility/result_of.hpp">boost/utility/result_of.hpp</a>></code>.</p>
|
|
|
|
<p>If your compiler supports <code>decltype</code>,
|
|
then you can enable automatic result type deduction by
|
|
defining the macro <code>BOOST_RESULT_OF_USE_DECLTYPE</code>,
|
|
as in the following example.</p>
|
|
|
|
<blockquote>
|
|
<pre>#define BOOST_RESULT_OF_USE_DECLTYPE
|
|
#include <boost/utility/result_of.hpp>
|
|
|
|
struct functor {
|
|
template<class T>
|
|
T operator()(T x)
|
|
{
|
|
return x;
|
|
}
|
|
};
|
|
|
|
typedef boost::result_of<
|
|
functor(int)
|
|
>::type type;</pre>
|
|
</blockquote>
|
|
|
|
<p>If <code>decltype</code> is not enabled,
|
|
then automatic result type deduction of function
|
|
objects is not possible. Instead, <code>result_of</code>
|
|
uses the following protocol to allow the programmer to
|
|
specify a type. When <code>F</code> is a class type with a
|
|
member type <code>result_type</code>,
|
|
<code>result_of<F(T1, T2, ...,
|
|
T<em>N</em>)></code> is
|
|
<code>F::result_type</code>. When <code>F</code> does
|
|
not contain <code>result_type</code>,
|
|
<code>result_of<F(T1, T2, ...,
|
|
T<em>N</em>)></code> is <code>F::result<F(T1,
|
|
T2, ..., T<em>N</em>)>::type</code> when
|
|
<code><em>N</em> > 0</code> or <code>void</code>
|
|
when <code><em>N</em> = 0</code>. Note that it is the
|
|
responsibility of the programmer to ensure that
|
|
function objects accurately advertise their result
|
|
type via this protocol, as in the following
|
|
example.</p>
|
|
|
|
<blockquote>
|
|
<pre>struct functor {
|
|
template<class> struct result;
|
|
|
|
template<class F, class T>
|
|
struct result<F(T)> {
|
|
typedef T type;
|
|
};
|
|
|
|
template<class T>
|
|
T operator()(T x)
|
|
{
|
|
return x;
|
|
}
|
|
};
|
|
|
|
typedef boost::result_of<
|
|
functor(int)
|
|
>::type type;</pre>
|
|
</blockquote>
|
|
|
|
<a name="BOOST_NO_RESULT_OF"></a>
|
|
<p>This implementation of <code>result_of</code>
|
|
requires class template partial specialization, the
|
|
ability to parse function types properly, and support
|
|
for SFINAE. If <code>result_of</code> is not supported
|
|
by your compiler, including the header
|
|
<code>boost/utility/result_of.hpp</code> will
|
|
define the macro <code>BOOST_NO_RESULT_OF</code>.</p>
|
|
|
|
<p>For additional information
|
|
about <code>result_of</code>, see the C++ Library
|
|
Technical Report,
|
|
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf">N1836</a>,
|
|
or, for motivation and design rationale,
|
|
the <code>result_of</code> <a href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1454.html">proposal</a>.</p>
|
|
Contributed by Doug Gregor.</p>
|
|
|
|
<h2>Class templates for the Base-from-Member Idiom</h2>
|
|
<p>See <a href="base_from_member.html">separate documentation</a>.</p>
|
|
<h2><a name="BOOST_BINARY">Macro BOOST_BINARY</a></h2>
|
|
|
|
<p>The macro <code>BOOST_BINARY</code> is used for the
|
|
representation of binary literals. It takes as an argument
|
|
a binary number arranged as an arbitrary amount of 1s and 0s in
|
|
groupings of length 1 to 8, with groups separated
|
|
by spaces. The type of the literal yielded is determined by
|
|
the same rules as those of hex and octal
|
|
literals (<i>2.13.1p1</i>). By implementation, this macro
|
|
expands directly to an octal literal during preprocessing, so
|
|
there is no overhead at runtime and the result is useable in
|
|
any place that an octal literal would be.</p>
|
|
|
|
<p>In order to directly support binary literals with suffixes,
|
|
additional macros of the form BOOST_BINARY_XXX are also
|
|
provided, where XXX is a standard integer suffix in all capital
|
|
letters. In addition, LL and ULL suffixes may be used for representing
|
|
long long and unsigned long long types in compilers which provide
|
|
them as an extension.</p>
|
|
|
|
|
|
<p>The BOOST_BINARY family of macros resides in the header
|
|
<a
|
|
href="../../boost/utility/binary.hpp"><boost/utility/binary.hpp></a>
|
|
which is automatically included by
|
|
<a
|
|
href="../../boost/utility.hpp"><boost/utility.hpp></a>.
|
|
|
|
<p>Contributed by Matt Calabrese.</p><p>
|
|
</p><h3>Example</h3>
|
|
<blockquote>
|
|
<pre>
|
|
void foo( int );
|
|
|
|
void foo( unsigned long );
|
|
|
|
void bar()
|
|
{
|
|
int value1 = BOOST_BINARY( 100 111000 01 1 110 );
|
|
|
|
unsigned long value2 = BOOST_BINARY_UL( 100 001 ); // unsigned long
|
|
|
|
long long value3 = BOOST_BINARY_LL( 11 000 ); // long long if supported
|
|
|
|
assert( BOOST_BINARY( 10010 )
|
|
& BOOST_BINARY( 11000 )
|
|
== BOOST_BINARY( 10000 )
|
|
);
|
|
|
|
foo( BOOST_BINARY( 1010 ) ); // calls the first foo
|
|
|
|
foo( BOOST_BINARY_LU( 1010 ) ); // calls the second foo
|
|
}
|
|
</pre></blockquote>
|
|
<hr>
|
|
<p>Revised <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan
|
|
-->04 September, 2008<!--webbot bot="Timestamp" endspan i-checksum="39369"
|
|
-->
|
|
</p>
|
|
<p>© Copyright Beman Dawes 1999-2003.</p>
|
|
<p>Distributed under the Boost Software License, Version 1.0. See
|
|
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p>
|
|
|
|
</body>
|
|
</html>
|