| [12] | 1 | <html> | 
|---|
 | 2 |  | 
|---|
 | 3 | <head> | 
|---|
 | 4 | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | 
|---|
 | 5 | <title>Boost Function Object Adapter Library</title> | 
|---|
 | 6 | </head> | 
|---|
 | 7 |  | 
|---|
 | 8 | <body bgcolor="#FFFFFF" text="#000000"> | 
|---|
 | 9 |  | 
|---|
 | 10 | <table border="1" bgcolor="#007F7F" cellpadding="2"> | 
|---|
 | 11 |   <tr> | 
|---|
 | 12 |     <td bgcolor="#FFFFFF"><img src="../../boost.png" alt="boost.png (6897 bytes)" WIDTH="277" HEIGHT="86"></td> | 
|---|
 | 13 |     <td><a href="../../index.htm"><font face="Arial" color="#FFFFFF"><big>Home </big></font></a></td> | 
|---|
 | 14 |     <td><a href="../libraries.htm"><font face="Arial" color="#FFFFFF"><big>Libraries </big></font></a></td> | 
|---|
 | 15 |     <td><a href="../../people/people.htm"><font face="Arial" color="#FFFFFF"><big>People </big></font></a></td> | 
|---|
 | 16 |     <td><a href="../../more/faq.htm"><font face="Arial" color="#FFFFFF"><big>FAQ </big></font></a></td> | 
|---|
 | 17 |     <td><a href="../../more/index.htm"><font face="Arial" color="#FFFFFF"><big>More </big></font></a></td> | 
|---|
 | 18 |   </tr> | 
|---|
 | 19 | </table> | 
|---|
 | 20 |  | 
|---|
 | 21 | <h1>Function Object Traits</h1> | 
|---|
 | 22 |  | 
|---|
 | 23 | <p>The header <nobr><a | 
|---|
 | 24 | href="../../boost/functional.hpp">functional.hpp</a></nobr> provides two | 
|---|
 | 25 | traits class templates for functions and function objects:</p> | 
|---|
 | 26 |  | 
|---|
 | 27 | <table border="1"> | 
|---|
 | 28 | <tr> | 
|---|
 | 29 |         <th>Type</th> | 
|---|
 | 30 |         <th>Contents</th> | 
|---|
 | 31 |         <th>Description</th> | 
|---|
 | 32 | </tr> | 
|---|
 | 33 | <tr> | 
|---|
 | 34 |         <td valign="top" rowspan="4"><tt><nobr>template <typename T></nobr><br><nobr>struct unary_traits<nobr></tt> | 
|---|
 | 35 |         </td> | 
|---|
 | 36 |         <td valign="top"><tt><nobr>function_type</nobr></tt> | 
|---|
 | 37 |         </td> | 
|---|
 | 38 |         <td valign="top">The type of the function or function object itself (i.e., <tt>T</tt>). | 
|---|
 | 39 |         </td> | 
|---|
 | 40 | </tr> | 
|---|
 | 41 | <tr> | 
|---|
 | 42 |         <td valign="top"><tt><nobr>param_type</nobr></tt> | 
|---|
 | 43 |         </td> | 
|---|
 | 44 |         <td valign="top">The type that should be used to pass the function or function object as a parameter. | 
|---|
 | 45 |         </td> | 
|---|
 | 46 | </tr> | 
|---|
 | 47 | <tr> | 
|---|
 | 48 |         <td valign="top"><tt><nobr>result_type</nobr></tt> | 
|---|
 | 49 |         </td> | 
|---|
 | 50 |         <td valign="top">The type returned by the function or function object. | 
|---|
 | 51 |         </td> | 
|---|
 | 52 | </tr> | 
|---|
 | 53 | <tr> | 
|---|
 | 54 |         <td valign="top"><tt><nobr>argument_type</nobr></tt> | 
|---|
 | 55 |         </td> | 
|---|
 | 56 |         <td valign="top">The type of the argument to the function or function object. | 
|---|
 | 57 |         </td> | 
|---|
 | 58 | </tr> | 
|---|
 | 59 | <tr> | 
|---|
 | 60 |         <td valign="top" rowspan="5"><tt><nobr>template <typename T></nobr><br><nobr>struct binary_traits<nobr></tt> | 
|---|
 | 61 |         </td> | 
|---|
 | 62 |         <td valign="top"><tt><nobr>function_type</nobr></tt> | 
|---|
 | 63 |         </td> | 
|---|
 | 64 |         <td valign="top">The type of the function or function object itself (i.e., <tt>T</tt>). | 
|---|
 | 65 |         </td> | 
|---|
 | 66 | </tr> | 
|---|
 | 67 | <tr> | 
|---|
 | 68 |         <td valign="top"><tt><nobr>param_type</nobr></tt> | 
|---|
 | 69 |         </td> | 
|---|
 | 70 |         <td valign="top">The type that should be used to pass the function or function object as a parameter. | 
|---|
 | 71 |         </td> | 
|---|
 | 72 | </tr> | 
|---|
 | 73 | <tr> | 
|---|
 | 74 |         <td valign="top"><tt><nobr>result_type</nobr></tt> | 
|---|
 | 75 |         </td> | 
|---|
 | 76 |         <td valign="top">The type returned by the function or function object. | 
|---|
 | 77 |         </td> | 
|---|
 | 78 | </tr> | 
|---|
 | 79 | <tr> | 
|---|
 | 80 |         <td valign="top"><tt><nobr>first_argument_type</nobr></tt> | 
|---|
 | 81 |         </td> | 
|---|
 | 82 |         <td valign="top">The type of the first argument to the function or function object. | 
|---|
 | 83 |         </td> | 
|---|
 | 84 | </tr> | 
|---|
 | 85 | <tr> | 
|---|
 | 86 |         <td valign="top"><tt><nobr>second_argument_type</nobr></tt> | 
|---|
 | 87 |         </td> | 
|---|
 | 88 |         <td valign="top">The type of the second argument to the function or function object. | 
|---|
 | 89 |         </td> | 
|---|
 | 90 | </tr> | 
|---|
 | 91 | </table> | 
|---|
 | 92 |  | 
|---|
 | 93 | <h3>Usage</h3> | 
|---|
 | 94 |  | 
|---|
 | 95 | <p><tt><nobr>unary_traits</nobr></tt> should be instantiated with | 
|---|
 | 96 | either a function taking a single parameter, or an adaptable unary | 
|---|
 | 97 | function object (i.e., a class derived from | 
|---|
 | 98 | <tt><nobr>std::unary_function</nobr></tt> or one which provides the | 
|---|
 | 99 | same typedefs).  (See §20.3.1 in the C++ Standard.) | 
|---|
 | 100 |  | 
|---|
 | 101 | <p><tt><nobr>binary_traits</nobr></tt> should be instantiated with | 
|---|
 | 102 | either a function taking two parameters, or an adaptable binary | 
|---|
 | 103 | function object (i.e., a class derived from | 
|---|
 | 104 | <tt><nobr>std::binary_function</nobr></tt> or one which provides the | 
|---|
 | 105 | same typedefs).  (See §20.3.1 in the C++ Standard.) | 
|---|
 | 106 |  | 
|---|
 | 107 | <p>The most common usage of these templates is in function object | 
|---|
 | 108 | adapters, thus allowing them to adapt plain functions as well as | 
|---|
 | 109 | function objects.  You can do this by wherever you would normally | 
|---|
 | 110 | write, for example, | 
|---|
 | 111 |  | 
|---|
 | 112 | <blockquote><pre> | 
|---|
 | 113 | typename Operation::argument_type | 
|---|
 | 114 | </pre></blockquote> | 
|---|
 | 115 |  | 
|---|
 | 116 | <p>simply writing | 
|---|
 | 117 |  | 
|---|
 | 118 | <blockquote><pre> | 
|---|
 | 119 | typename boost::unary_traits<Operation>::argument_type | 
|---|
 | 120 | </pre></blockquote> | 
|---|
 | 121 |  | 
|---|
 | 122 | <p>instead. | 
|---|
 | 123 |  | 
|---|
 | 124 | <h3>Additional Types Defined</h3> | 
|---|
 | 125 |  | 
|---|
 | 126 | <p>In addition to the standard result and argument typedefs, these | 
|---|
 | 127 | traits templates define two additional types. | 
|---|
 | 128 |  | 
|---|
 | 129 | <h4><tt>function_type</tt></h4> | 
|---|
 | 130 |  | 
|---|
 | 131 | <p>This is the type of the function or function object, and can be | 
|---|
 | 132 | used in declarations such as</p> | 
|---|
 | 133 |  | 
|---|
 | 134 | <blockquote><pre> | 
|---|
 | 135 | template <class Predicate> | 
|---|
 | 136 | class unary_negate : // ... | 
|---|
 | 137 | { | 
|---|
 | 138 |   // ... | 
|---|
 | 139 |   private: | 
|---|
 | 140 |     <strong>typename unary_traits<Predicate>::function_type</strong> pred; | 
|---|
 | 141 | }; | 
|---|
 | 142 | </pre></blockquote> | 
|---|
 | 143 |  | 
|---|
 | 144 | <p>If this typedef were not provided, it would not be possible to | 
|---|
 | 145 | declare <tt>pred</tt> in a way that would allow | 
|---|
 | 146 | <tt><nobr>unary_negate</nobr></tt> to be instantiated with a function | 
|---|
 | 147 | type (see the C++ Standard §14.3.1 ¶3). | 
|---|
 | 148 |  | 
|---|
 | 149 | <h4><tt>param_type</tt></h4> | 
|---|
 | 150 |  | 
|---|
 | 151 | <p>This is a type suitable for passing the function or function object | 
|---|
 | 152 | as a parameter to another function.  For example, | 
|---|
 | 153 |  | 
|---|
 | 154 | <blockquote><pre> | 
|---|
 | 155 | template <class Predicate> | 
|---|
 | 156 | class unary_negate : // ... | 
|---|
 | 157 | { | 
|---|
 | 158 |   public: | 
|---|
 | 159 |     explicit unary_negate(<strong>typename unary_traits<Predicate>::param_type</strong> x) | 
|---|
 | 160 |         : | 
|---|
 | 161 |         pred(x) | 
|---|
 | 162 |     {} | 
|---|
 | 163 |     // ... | 
|---|
 | 164 | }; | 
|---|
 | 165 | </pre></blockquote> | 
|---|
 | 166 |  | 
|---|
 | 167 | <p>Function objects are passed by reference to const; function | 
|---|
 | 168 | pointers are passed by value.</p> | 
|---|
 | 169 |  | 
|---|
 | 170 |  | 
|---|
 | 171 | <h3>Limitations</h3> | 
|---|
 | 172 |  | 
|---|
 | 173 | <p>This library uses these traits within all function object adapters, | 
|---|
 | 174 | theoretically rendering <tt><nobr>ptr_fun</nobr></tt> obsolete. | 
|---|
 | 175 | However, third party adapters probably won't take advantage of this | 
|---|
 | 176 | mechanism, and so <tt><nobr>ptr_fun</nobr></tt> may still be required. | 
|---|
 | 177 | Accordingly, this library also provides <a | 
|---|
 | 178 | href="ptr_fun.html">improved versions of the standard function pointer | 
|---|
 | 179 | adapters</a>.</p> | 
|---|
 | 180 |  | 
|---|
 | 181 | <p>These traits templates will also not work with compilers that fail | 
|---|
 | 182 | to support partial specialisation of templates.  With these compilers, | 
|---|
 | 183 | the traits templates can only be instantiated with adaptable function | 
|---|
 | 184 | objects, thus requiring <tt><nobr>ptr_fun</nobr></tt> to be used, even | 
|---|
 | 185 | with the function object adapters in this library. | 
|---|
 | 186 |  | 
|---|
 | 187 | <hr> | 
|---|
 | 188 | <p>Copyright © 2000 Cadenza New Zealand Ltd.  Permission to copy, | 
|---|
 | 189 | use, modify, sell and distribute this document is granted provided | 
|---|
 | 190 | this copyright notice appears in all copies. This document is provided | 
|---|
 | 191 | "as is" without express or implied warranty, and with no claim as to | 
|---|
 | 192 | its suitability for any purpose.</p> | 
|---|
 | 193 |  | 
|---|
 | 194 | <p>Revised 28 June 2000</p> | 
|---|
 | 195 | </body> | 
|---|
 | 196 | </html> | 
|---|