Sophie

Sophie

distrib > Fedora > 14 > i386 > by-pkgid > 623999701586b0ea103ff2ccad7954a6 > files > 10687

boost-doc-1.44.0-1.fc14.noarch.rpm

<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">&lt;boost/utility.hpp&gt;</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-().&nbsp; This means that non-modifying computation of the next or 
			prior value requires a temporary, even though operator++() or operator--() is 
			provided.&nbsp; 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 &lt;class T&gt;
T next(T x) { return ++x; }

template &lt;class T, class Distance&gt;
T next(T x, Distance n)
{
    std::advance(x, n);
    return x;
}

template &lt;class T&gt;
T prior(T x) { return --x; }

template &lt;class T, class Distance&gt;
T prior(T x, Distance n)
{
    std::advance(x, -n);
    return x;
}</pre>
		</blockquote>
		<p>Usage is simple:</p>
		<blockquote>
			<pre>const std::list&lt;T&gt;::iterator p = get_some_iterator();
const std::list&lt;T&gt;::iterator prev = boost::prior(p);
const std::list&lt;T&gt;::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.&nbsp; 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.&nbsp; Sometimes there are 
			possible copy semantics, but these would be of very limited usefulness and be 
			very difficult to implement correctly.&nbsp; 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.&nbsp; 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.&nbsp; 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 &lt;boost/utility.hpp&gt;

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.&nbsp; Dave Abrahams notes concern 
			about the effect on compiler optimization of adding (even trivial inline) 
			destructor declarations. He says &quot;Probably this concern is misplaced, 
			because noncopyable will be used mostly for classes which own resources and 
			thus have non-trivial destruction semantics.&quot;</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 &lt;typename T&gt; inline T*                addressof(T& v);
template &lt;typename T&gt; inline const T*          addressof(const T& v);
template &lt;typename T&gt; inline volatile T*       addressof(volatile T& v);
template &lt;typename T&gt; 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 &lt;boost/utility.hpp&gt;

struct useless_type {};
class nonaddressable {
  useless_type operator&() const;
};

void f() {
  nonaddressable x;
  nonaddressable* xp = boost::addressof(x);
  // nonaddressable* xpe = &amp;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&lt;F(T1, T2, ...,
                T<em>N</em>)&gt;::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>&lt;<a
                href="../../boost/utility/result_of.hpp">boost/utility/result_of.hpp</a>&gt;</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 &lt;boost/utility/result_of.hpp&gt;

struct functor {
    template&lt;class T&gt;
    T operator()(T x)
    {
        return x;
    }
};

typedef boost::result_of&lt;
    functor(int)
&gt;::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&lt;F(T1, T2, ...,
                T<em>N</em>)&gt;</code> is
                <code>F::result_type</code>. When <code>F</code> does
                not contain <code>result_type</code>,
                <code>result_of&lt;F(T1, T2, ...,
                T<em>N</em>)&gt;</code> is <code>F::result&lt;F(T1,
                T2, ..., T<em>N</em>)&gt;::type</code> when
                <code><em>N</em> &gt; 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&lt;class&gt; struct result;

    template&lt;class F, class T&gt;
    struct result&lt;F(T)&gt; {
        typedef T type;
    };

    template&lt;class T&gt;
    T operator()(T x)
    {
        return x;
    }
};

typedef boost::result_of&lt;
    functor(int)
&gt;::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">&lt;boost/utility/binary.hpp&gt;</a>
                which is automatically included by
                <a
                href="../../boost/utility.hpp">&lt;boost/utility.hpp&gt;</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&nbsp; <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan
-->04 September, 2008<!--webbot bot="Timestamp" endspan i-checksum="39369"
-->
		</p>
		<p>&copy; 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>