Brian Silverman | 60e3e2a | 2018-08-04 23:57:12 -0700 | [diff] [blame] | 1 | <html> |
| 2 | <head> |
| 3 | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> |
| 4 | <title>Header boost/utility.hpp Documentation</title> |
| 5 | </head> |
| 6 | <body bgcolor="#FFFFFF" text="#000000"> |
| 7 | <h1><img src="../../boost.png" alt="boost.png (6897 bytes)" align="center" WIDTH="277" HEIGHT="86">Header |
| 8 | <a href="../../boost/utility.hpp">boost/utility.hpp</a></h1> |
| 9 | <p>The entire contents of the header <code><a href="../../boost/utility.hpp"><boost/utility.hpp></a></code> |
| 10 | are in <code>namespace boost</code>.</p> |
| 11 | <h2>Contents</h2> |
| 12 | <ul> |
| 13 | <li> |
| 14 | Class templates supporting the <a href="doc/html/base_from_member.html"> |
| 15 | base-from-member idiom</a></li> |
| 16 | <li> |
| 17 | Function templates <a href="../core/doc/html/core/checked_delete.html">checked_delete() and |
| 18 | checked_array_delete()</a> (moved to the Boost.Core library)</li> |
| 19 | <li> |
| 20 | Function templates <a href="../iterator/doc/html/iterator/algorithms/next_prior.html">next() and prior()</a> (moved to the Boost.Iterator library)</li> |
| 21 | <li> |
| 22 | Class <a href="../core/doc/html/core/noncopyable.html">noncopyable</a> (moved to the Boost.Core library)</li> |
| 23 | <li> |
| 24 | Function template <a href="../core/doc/html/core/addressof.html">addressof()</a> (moved to the Boost.Core library)</li> |
| 25 | <li>Class template <a href="#result_of">result_of</a></li> |
| 26 | <li> |
| 27 | Macro <a href="#BOOST_BINARY">BOOST_BINARY</a></li> |
| 28 | <li><a href="index.html">Other utilities not part of <code>utility.hpp</code></a></li> |
| 29 | </ul> |
| 30 | <h2> |
| 31 | |
| 32 | <h2><a name="result_of">Class template |
| 33 | result_of</a></h2> <p>The class template |
| 34 | <code>result_of</code> helps determine the type of a |
| 35 | call expression. For example, given an lvalue <code>f</code> of |
| 36 | type <code>F</code> and lvalues <code>t1</code>, |
| 37 | <code>t2</code>, ..., <code>t<em>N</em></code> of |
| 38 | types <code>T1</code>, <code>T2</code>, ..., |
| 39 | <code>T<em>N</em></code>, respectively, the type |
| 40 | <code>result_of<F(T1, T2, ..., |
| 41 | T<em>N</em>)>::type</code> defines the result type |
| 42 | of the expression <code>f(t1, t2, |
| 43 | ...,t<em>N</em>)</code>. This implementation permits |
| 44 | the type <code>F</code> to be a function pointer, |
| 45 | function reference, member function pointer, or class |
| 46 | type. By default, <em>N</em> may be any value between 0 and |
| 47 | 16. To change the upper limit, define the macro |
| 48 | <code>BOOST_RESULT_OF_NUM_ARGS</code> to the maximum |
| 49 | value for <em>N</em>. Class template <code>result_of</code> |
| 50 | resides in the header <code><<a |
| 51 | href="../../boost/utility/result_of.hpp">boost/utility/result_of.hpp</a>></code>.</p> |
| 52 | |
| 53 | <p>If your compiler's support for <code>decltype</code> is |
| 54 | adequate, <code>result_of</code> automatically uses it to |
| 55 | deduce the type of the call expression, in which case |
| 56 | <code>result_of<F(T1, T2, ..., |
| 57 | T<em>N</em>)>::type</code> names the type |
| 58 | <code>decltype(boost::declval<F>()(boost::declval<T1>(), |
| 59 | boost::declval<T2>(), ..., |
| 60 | boost::declval<T<em>N</em>>()))</code>, as in the |
| 61 | following example.</p> |
| 62 | |
| 63 | <blockquote> |
| 64 | <pre>struct functor { |
| 65 | template<class T> |
| 66 | T operator()(T x) |
| 67 | { |
| 68 | return x; |
| 69 | } |
| 70 | }; |
| 71 | |
| 72 | typedef boost::result_of< |
| 73 | functor(int) |
| 74 | >::type type; // type is int</pre> |
| 75 | </blockquote> |
| 76 | |
| 77 | <p>You can test whether <code>result_of</code> is using |
| 78 | <code>decltype</code> by checking if the macro |
| 79 | <code>BOOST_RESULT_OF_USE_DECLTYPE</code> is defined after |
| 80 | including <code>result_of.hpp</code>. You can also force |
| 81 | <code>result_of</code> to use <code>decltype</code> by |
| 82 | defining <code>BOOST_RESULT_OF_USE_DECLTYPE</code> prior |
| 83 | to including <code>result_of.hpp</code>.</p> |
| 84 | |
| 85 | <p>If <code>decltype</code> is not used, |
| 86 | then automatic result type deduction of function |
| 87 | objects is not possible. Instead, <code>result_of</code> |
| 88 | uses the following protocol to allow the programmer to |
| 89 | specify a type. When <code>F</code> is a class type with a |
| 90 | member type <code>result_type</code>, |
| 91 | <code>result_of<F(T1, T2, ..., |
| 92 | T<em>N</em>)>::type</code> is |
| 93 | <code>F::result_type</code>. When <code>F</code> does |
| 94 | not contain <code>result_type</code>, |
| 95 | <code>result_of<F(T1, T2, ..., |
| 96 | T<em>N</em>)>::type</code> is <code>F::result<F(T1, |
| 97 | T2, ..., T<em>N</em>)>::type</code> when |
| 98 | <code><em>N</em> > 0</code> or <code>void</code> |
| 99 | when <code><em>N</em> = 0</code>. Note that it is the |
| 100 | responsibility of the programmer to ensure that |
| 101 | function objects accurately advertise their result |
| 102 | type via this protocol, as in the following |
| 103 | example.</p> |
| 104 | |
| 105 | <blockquote> |
| 106 | <pre>struct functor { |
| 107 | template<class> struct result; |
| 108 | |
| 109 | template<class F, class T> |
| 110 | struct result<F(T)> { |
| 111 | typedef T type; |
| 112 | }; |
| 113 | |
| 114 | template<class T> |
| 115 | T operator()(T x) |
| 116 | { |
| 117 | return x; |
| 118 | } |
| 119 | }; |
| 120 | |
| 121 | typedef boost::result_of< |
| 122 | functor(int) |
| 123 | >::type type; // type is int</pre> |
| 124 | </blockquote> |
| 125 | |
| 126 | <p>Since <code>decltype</code> is a new language |
| 127 | feature recently standardized in C++11, |
| 128 | if you are writing a function object |
| 129 | to be used with <code>result_of</code>, for |
| 130 | maximum portability, you might consider following |
| 131 | the above protocol even if your compiler has |
| 132 | proper <code>decltype</code> support. If you wish to continue to |
| 133 | use the protocol on compilers that |
| 134 | support <code>decltype</code>, there are two options: |
| 135 | You can use <code>boost::tr1_result_of</code>, which is also |
| 136 | defined in <code><<a href="../../boost/utility/result_of.hpp">boost/utility/result_of.hpp</a>></code>. |
| 137 | Alternatively, you can define the macro |
| 138 | <code>BOOST_RESULT_OF_USE_TR1</code>, which causes |
| 139 | <code>result_of</code> to use the protocol described |
| 140 | above instead of <code>decltype</code>. If you choose to |
| 141 | follow the protocol, take care to ensure that the |
| 142 | <code>result_type</code> and |
| 143 | <code>result<></code> members accurately |
| 144 | represent the return type of |
| 145 | <code>operator()</code> given a call expression.</p> |
| 146 | |
| 147 | <p>Additionally, <code>boost::result_of</code> |
| 148 | provides a third mode of operation, which some users |
| 149 | may find convenient. When |
| 150 | <code>BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK</code> |
| 151 | is defined, <code>boost::result_of</code> behaves as |
| 152 | follows. If the function object has a member |
| 153 | type <code>result_type</code> or member |
| 154 | template <code>result<></code>, then |
| 155 | <code>boost::result_of</code> will use the TR1 |
| 156 | protocol. Otherwise, |
| 157 | <code>boost::result_of</code> will |
| 158 | use <code>decltype</code>. Using TR1 with |
| 159 | a <code>declytpe</code> fallback may workaround |
| 160 | certain problems at the cost of portability. For |
| 161 | example: |
| 162 | <ul> |
| 163 | <li>Deficient compiler: If your code |
| 164 | requires <code>boost::result_of</code> to work |
| 165 | with incomplete return types but your |
| 166 | compiler's <code>decltype</code> implementation |
| 167 | does not support incomplete return types, then you |
| 168 | can use the TR1 protocol as a workaround. Support |
| 169 | for incomplete return types was added late in the |
| 170 | C++11 standardization process |
| 171 | (see <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf">N3276</a>) |
| 172 | and is not implemented by some compilers.</li> |
| 173 | |
| 174 | <li>Deficient legacy code: If your existing TR1 |
| 175 | function object advertises a different type than |
| 176 | the actual result type deduced |
| 177 | by <code>decltype</code>, then using TR1 with a |
| 178 | <code>decltype</code> fallback will allow you to |
| 179 | work with both your existing TR1 function objects |
| 180 | and new C++11 function object. This situation |
| 181 | could occur if your legacy function objects |
| 182 | misused the TR1 protocol. See the documentation on |
| 183 | known <a href="#result_of_tr1_diff">differences</a> |
| 184 | between <code>boost::result_of</code> and TR1.</li> |
| 185 | </ul> |
| 186 | |
| 187 | <a name="BOOST_NO_RESULT_OF"></a> |
| 188 | <p>This implementation of <code>result_of</code> |
| 189 | requires class template partial specialization, the |
| 190 | ability to parse function types properly, and support |
| 191 | for SFINAE. If <code>result_of</code> is not supported |
| 192 | by your compiler, including the header |
| 193 | <code>boost/utility/result_of.hpp</code> will |
| 194 | define the macro <code>BOOST_NO_RESULT_OF</code>.</p> |
| 195 | |
| 196 | <p>For additional information |
| 197 | about <code>result_of</code>, see the C++ Library |
| 198 | Technical Report, |
| 199 | <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf">N1836</a>, |
| 200 | or, for motivation and design rationale, |
| 201 | the <code>result_of</code> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1454.html">proposal</a>.</p> |
| 202 | |
| 203 | <a name="result_of_guidelines"> |
| 204 | <h3>Usage guidelines for boost::result_of</h3> |
| 205 | </a> |
| 206 | |
| 207 | <p>The following are general suggestions about when |
| 208 | and how to use <code>boost::result_of</code>.</p> |
| 209 | |
| 210 | <ol> |
| 211 | <li> If you are targeting C++11 and are not concerned |
| 212 | about portability to non-compliant compilers or |
| 213 | previous versions of the standard, then use |
| 214 | <code>std::result_of</code>. If <code>std::result_of</code> |
| 215 | meets your needs, then there's no reason to stop using |
| 216 | it.</li> |
| 217 | |
| 218 | <li> If you are targeting C++11 but may port your code |
| 219 | to legacy compilers at some time in the future, then |
| 220 | use <code>boost::result_of</code> with |
| 221 | <code>decltype</code>. When <code>decltype</code> is |
| 222 | used <code>boost::result_of</code> |
| 223 | and <code>std::result_of</code> are usually |
| 224 | interchangeable. See the documentation on |
| 225 | known <a href="#result_of_cxx11_diff">differences</a> |
| 226 | between boost::result_of and C++11 result_of.</li> |
| 227 | |
| 228 | <li> If compiler portability is required, |
| 229 | use <code>boost::result_of</code> with the TR1 protocol.</li> |
| 230 | </ol> |
| 231 | |
| 232 | <p>Regardless of how you |
| 233 | configure <code>boost::result_of</code>, it is |
| 234 | important to bear in mind that the return type of a |
| 235 | function may change depending on its arguments, and |
| 236 | additionally, the return type of a member function may |
| 237 | change depending on the cv-qualification of the |
| 238 | object. <code>boost::result_of</code> must be passed |
| 239 | the appropriately cv-qualified types in order to |
| 240 | deduce the corresponding return type. For example: |
| 241 | |
| 242 | <blockquote> |
| 243 | <pre>struct functor { |
| 244 | int& operator()(int); |
| 245 | int const& operator()(int) const; |
| 246 | |
| 247 | float& operator()(float&); |
| 248 | float const& operator()(float const&); |
| 249 | }; |
| 250 | |
| 251 | typedef boost::result_of< |
| 252 | functor(int) |
| 253 | >::type type1; // type1 is int & |
| 254 | |
| 255 | typedef boost::result_of< |
| 256 | const functor(int) |
| 257 | >::type type2; // type2 is int const & |
| 258 | |
| 259 | typedef boost::result_of< |
| 260 | functor(float&) |
| 261 | >::type type3; // type3 is float & |
| 262 | |
| 263 | typedef boost::result_of< |
| 264 | functor(float const&) |
| 265 | >::type type4; // type4 is float const &</pre> |
| 266 | </blockquote> |
| 267 | |
| 268 | <a name="result_of_tr1_protocol_guidelines"> |
| 269 | <h3>Usage guidelines for the TR1 result_of protocol</h3> |
| 270 | </a> |
| 271 | |
| 272 | <p>On compliant C++11 |
| 273 | compilers, <code>boost::result_of</code> can |
| 274 | use <code>decltype</code> to deduce the type of any |
| 275 | call expression, including calls to function |
| 276 | objects. However, on pre-C++11 compilers or on |
| 277 | compilers without adequate decltype support, |
| 278 | additional scaffolding is needed from function |
| 279 | objects as described above. The following are |
| 280 | suggestions about how to use the TR1 protocol.</p> |
| 281 | |
| 282 | <ul> |
| 283 | <li>When the return type does not depend on the |
| 284 | argument types or the cv-qualification of the |
| 285 | function object, simply |
| 286 | define <code>result_type</code>. There is no need |
| 287 | to use the <code>result</code> template unless the |
| 288 | return type varies.</li> |
| 289 | |
| 290 | <li>Use the protocol specified type when defining |
| 291 | function prototypes. This can help ensure the |
| 292 | actual return type does not get out of sync with |
| 293 | the protocol specification. For example: |
| 294 | |
| 295 | <blockquote> |
| 296 | <pre>struct functor { |
| 297 | typedef int result_type; |
| 298 | result_type operator()(int); |
| 299 | };</pre> |
| 300 | </blockquote> </li> |
| 301 | |
| 302 | <li>Always specify the <code>result</code> |
| 303 | specialization near the corresponding |
| 304 | <code>operator()</code> overload. This can make it |
| 305 | easier to keep the specializations in sync with the |
| 306 | overloads. For example: |
| 307 | |
| 308 | <blockquote> |
| 309 | <pre>struct functor { |
| 310 | template<class> struct result; |
| 311 | |
| 312 | template<class F> |
| 313 | struct result<F(int)> { |
| 314 | typedef int& type; |
| 315 | }; |
| 316 | result<functor(int)>::type operator()(int); |
| 317 | |
| 318 | template<class F> |
| 319 | struct result<const F(int)> { |
| 320 | typedef int const& type; |
| 321 | }; |
| 322 | result<const functor(int)>::type operator()(int) const; |
| 323 | };</pre> |
| 324 | </blockquote> </li> |
| 325 | |
| 326 | <li>Use type transformations to simplify |
| 327 | the <code>result</code> template specialization. For |
| 328 | example, the following uses |
| 329 | <a href="../type_traits/doc/html/index.html">Boost.TypeTraits</a> |
| 330 | to specialize the <code>result</code> template for |
| 331 | a single <code>operator()</code> that can be called on |
| 332 | both a const and non-const function object with |
| 333 | either an lvalue or rvalue argument. |
| 334 | |
| 335 | <blockquote> |
| 336 | <pre>struct functor { |
| 337 | template<class> struct result; |
| 338 | |
| 339 | template<class F, class T> |
| 340 | struct result<F(T)> |
| 341 | : boost::remove_cv< |
| 342 | typename boost::remove_reference<T>::type |
| 343 | > |
| 344 | {}; |
| 345 | |
| 346 | template<class T> |
| 347 | T operator()(T const& x) const; |
| 348 | };</pre> |
| 349 | </blockquote></li> |
| 350 | </ul> |
| 351 | |
| 352 | <a name="result_of_tr1_diff"> |
| 353 | <h3>Known differences between boost::result_of and TR1 result_of</h3> |
| 354 | </a> |
| 355 | |
| 356 | When using <code>decltype</code>, <code>boost::result_of</code> |
| 357 | ignores the TR1 protocol and instead deduces the |
| 358 | return type of function objects directly |
| 359 | via <code>decltype</code>. In most situations, users |
| 360 | will not notice a difference, so long as they use the |
| 361 | protocol correctly. The following are situations in |
| 362 | which the type deduced |
| 363 | by <code>boost::result_of</code> is known to differ depending on |
| 364 | whether <code>decltype</code> or the TR1 protocol is |
| 365 | used. |
| 366 | |
| 367 | <ul> |
| 368 | <li> TR1 protocol misusage |
| 369 | |
| 370 | <p>When using the TR1 |
| 371 | protocol, <code>boost::result_of</code> cannot |
| 372 | detect whether the actual type of a call to a |
| 373 | function object is the same as the type specified |
| 374 | by the protocol, which allows for the possibility |
| 375 | of inadvertent mismatches between the specified |
| 376 | type and the actual type. When |
| 377 | using <code>decltype</code>, these subtle bugs |
| 378 | may result in compilation errors. For example:</p> |
| 379 | |
| 380 | <blockquote> |
| 381 | <pre>struct functor { |
| 382 | typedef short result_type; |
| 383 | int operator()(short); |
| 384 | }; |
| 385 | |
| 386 | #ifdef BOOST_RESULT_OF_USE_DECLTYPE |
| 387 | |
| 388 | BOOST_STATIC_ASSERT(( |
| 389 | boost::is_same<boost::result_of<functor(short)>::type, int>::value |
| 390 | )); |
| 391 | |
| 392 | #else |
| 393 | |
| 394 | BOOST_STATIC_ASSERT(( |
| 395 | boost::is_same<boost::result_of<functor(short)>::type, short>::value |
| 396 | )); |
| 397 | |
| 398 | #endif</pre> |
| 399 | </blockquote> |
| 400 | |
| 401 | <p>Note that the user can |
| 402 | force <code>boost::result_of</code> to use the TR1 |
| 403 | protocol even on platforms that |
| 404 | support <code>decltype</code> by |
| 405 | defining <code>BOOST_RESULT_OF_USE_TR1</code>.</p></li> |
| 406 | |
| 407 | <li> Nullary function objects |
| 408 | |
| 409 | <p>When using the TR1 protocol, <code>boost::result_of</code> |
| 410 | cannot always deduce the type of calls to |
| 411 | nullary function objects, in which case the |
| 412 | type defaults to void. When using <code>decltype</code>, |
| 413 | <code>boost::result_of</code> always gives the actual type of the |
| 414 | call expression. For example:</p> |
| 415 | |
| 416 | <blockquote> |
| 417 | <pre>struct functor { |
| 418 | template<class> struct result { |
| 419 | typedef int type; |
| 420 | }; |
| 421 | int operator()(); |
| 422 | }; |
| 423 | |
| 424 | #ifdef BOOST_RESULT_OF_USE_DECLTYPE |
| 425 | |
| 426 | BOOST_STATIC_ASSERT(( |
| 427 | boost::is_same<boost::result_of<functor()>::type, int>::value |
| 428 | )); |
| 429 | |
| 430 | #else |
| 431 | |
| 432 | BOOST_STATIC_ASSERT(( |
| 433 | boost::is_same<boost::result_of<functor()>::type, void>::value |
| 434 | )); |
| 435 | |
| 436 | #endif</pre> |
| 437 | </blockquote> |
| 438 | |
| 439 | <p>Note that there are some workarounds for the |
| 440 | nullary function problem. So long as the return |
| 441 | type does not vary, |
| 442 | <code>result_type</code> can always be used to |
| 443 | specify the return type regardless of arity. If the |
| 444 | return type does vary, then the user can |
| 445 | specialize <code>boost::result_of</code> itself for |
| 446 | nullary calls.</p></li> |
| 447 | |
| 448 | <li> Non-class prvalues and cv-qualification |
| 449 | |
| 450 | <p>When using the TR1 |
| 451 | protocol, <code>boost::result_of</code> will |
| 452 | report the cv-qualified type specified |
| 453 | by <code>result_type</code> or |
| 454 | the <code>result</code> template regardless of |
| 455 | the actual cv-qualification of the call |
| 456 | expression. When using |
| 457 | <code>decltype</code>, <code>boost::result_of</code> |
| 458 | will report the actual type of the call expression, |
| 459 | which is not cv-qualified when the expression is a |
| 460 | non-class prvalue. For example:</p> |
| 461 | |
| 462 | <blockquote> |
| 463 | <pre>struct functor { |
| 464 | template<class> struct result; |
| 465 | template<class F, class T> struct result<F(const T)> { |
| 466 | typedef const T type; |
| 467 | }; |
| 468 | |
| 469 | const short operator()(const short); |
| 470 | int const & operator()(int const &); |
| 471 | }; |
| 472 | |
| 473 | // Non-prvalue call expressions work the same with or without decltype. |
| 474 | |
| 475 | BOOST_STATIC_ASSERT(( |
| 476 | boost::is_same< |
| 477 | boost::result_of<functor(int const &)>::type, |
| 478 | int const & |
| 479 | ::value |
| 480 | )); |
| 481 | |
| 482 | // Non-class prvalue call expressions are not actually cv-qualified, |
| 483 | // but only the decltype-based result_of reports this accurately. |
| 484 | |
| 485 | #ifdef BOOST_RESULT_OF_USE_DECLTYPE |
| 486 | |
| 487 | BOOST_STATIC_ASSERT(( |
| 488 | boost::is_same< |
| 489 | boost::result_of<functor(const short)>::type, |
| 490 | short |
| 491 | ::value |
| 492 | )); |
| 493 | |
| 494 | #else |
| 495 | |
| 496 | BOOST_STATIC_ASSERT(( |
| 497 | boost::is_same< |
| 498 | boost::result_of<functor(const short)>::type, |
| 499 | const short |
| 500 | ::value |
| 501 | )); |
| 502 | |
| 503 | #endif</pre> |
| 504 | </blockquote></li> |
| 505 | </ul> |
| 506 | |
| 507 | <a name="result_of_cxx11_diff"> |
| 508 | <h3>Known differences between boost::result_of and C++11 result_of</h3> |
| 509 | </a> |
| 510 | |
| 511 | <p>When using <code>decltype</code>, <code>boost::result_of</code> |
| 512 | implements most of the C++11 result_of |
| 513 | specification. One known exception is that |
| 514 | <code>boost::result_of</code> does not implement the |
| 515 | requirements regarding pointers to member data.</p> |
| 516 | |
| 517 | <p>Created by Doug Gregor. Contributions from Daniel Walker, Eric Niebler, Michel Morin and others</p> |
| 518 | |
| 519 | <h2><a name="BOOST_BINARY">Macro BOOST_BINARY</a></h2> |
| 520 | |
| 521 | <p>The macro <code>BOOST_BINARY</code> is used for the |
| 522 | representation of binary literals. It takes as an argument |
| 523 | a binary number arranged as an arbitrary amount of 1s and 0s in |
| 524 | groupings of length 1 to 8, with groups separated |
| 525 | by spaces. The type of the literal yielded is determined by |
| 526 | the same rules as those of hex and octal |
| 527 | literals (<i>2.13.1p1</i>). By implementation, this macro |
| 528 | expands directly to an octal literal during preprocessing, so |
| 529 | there is no overhead at runtime and the result is useable in |
| 530 | any place that an octal literal would be.</p> |
| 531 | |
| 532 | <p>In order to directly support binary literals with suffixes, |
| 533 | additional macros of the form BOOST_BINARY_XXX are also |
| 534 | provided, where XXX is a standard integer suffix in all capital |
| 535 | letters. In addition, LL and ULL suffixes may be used for representing |
| 536 | long long and unsigned long long types in compilers which provide |
| 537 | them as an extension.</p> |
| 538 | |
| 539 | |
| 540 | <p>The BOOST_BINARY family of macros resides in the header |
| 541 | <a |
| 542 | href="../../boost/utility/binary.hpp"><boost/utility/binary.hpp></a> |
| 543 | which is automatically included by |
| 544 | <a |
| 545 | href="../../boost/utility.hpp"><boost/utility.hpp></a>. |
| 546 | |
| 547 | <p>Contributed by Matt Calabrese.</p><p> |
| 548 | </p><h3>Example</h3> |
| 549 | <blockquote> |
| 550 | <pre> |
| 551 | void foo( int ); |
| 552 | |
| 553 | void foo( unsigned long ); |
| 554 | |
| 555 | void bar() |
| 556 | { |
| 557 | int value1 = BOOST_BINARY( 100 111000 01 1 110 ); |
| 558 | |
| 559 | unsigned long value2 = BOOST_BINARY_UL( 100 001 ); // unsigned long |
| 560 | |
| 561 | long long value3 = BOOST_BINARY_LL( 11 000 ); // long long if supported |
| 562 | |
| 563 | assert( BOOST_BINARY( 10010 ) |
| 564 | & BOOST_BINARY( 11000 ) |
| 565 | == BOOST_BINARY( 10000 ) |
| 566 | ); |
| 567 | |
| 568 | foo( BOOST_BINARY( 1010 ) ); // calls the first foo |
| 569 | |
| 570 | foo( BOOST_BINARY_LU( 1010 ) ); // calls the second foo |
| 571 | } |
| 572 | </pre></blockquote> |
| 573 | <hr> |
| 574 | <p>Revised <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan |
| 575 | -->04 September, 2008<!--webbot bot="Timestamp" endspan i-checksum="39369" |
| 576 | --> |
| 577 | </p> |
| 578 | <p>© Copyright Beman Dawes 1999-2003.</p> |
| 579 | <p>Distributed under the Boost Software License, Version 1.0. See |
| 580 | <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p> |
| 581 | |
| 582 | </body> |
| 583 | </html> |