tti_detail_has_member_function.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Introspecting member function</title>
  5. <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../index.html" title="Chapter&#160;1.&#160;The Type Traits Introspection Library">
  8. <link rel="up" href="../index.html" title="Chapter&#160;1.&#160;The Type Traits Introspection Library">
  9. <link rel="prev" href="tti_detail_has_member_data.html" title="Introspecting member data">
  10. <link rel="next" href="tti_detail_has_static_member_data.html" title="Introspecting static member data">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="tti_detail_has_member_data.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="tti_detail_has_static_member_data.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  27. <a name="the_type_traits_introspection_library.tti_detail_has_member_function"></a><a class="link" href="tti_detail_has_member_function.html" title="Introspecting member function">Introspecting
  28. member function</a>
  29. </h2></div></div></div>
  30. <p>
  31. The TTI macro <code class="computeroutput"><a class="link" href="../BOOST_TT_idm46187185705488.html" title="Macro BOOST_TTI_HAS_MEMBER_FUNCTION">BOOST_TTI_HAS_MEMBER_FUNCTION</a></code>
  32. introspects a member function of a class.
  33. </p>
  34. <p>
  35. BOOST_TTI_HAS_MEMBER_FUNCTION takes a single parameter which is the name of
  36. an inner member function whose existence the programmer wants to check. The
  37. macro generates a metafunction called "has_member_function_'name_of_inner_member_function'".
  38. </p>
  39. <p>
  40. The metafunction can be invoked in two different ways.
  41. </p>
  42. <p>
  43. The first way of invoking the metafunction is by passing it the enclosing type
  44. to introspect and a signature for the member function as a series of separate
  45. template arguments. The signature for the member function consists of the template
  46. arguments of a return type, of optional parameter types in the form of a boost::mpl
  47. forward sequence of types, and of an optional Boost FunctionTypes tag type.
  48. A typical boost::mpl forward sequence of types is a boost::mpl::vector&lt;&gt;.
  49. </p>
  50. <p>
  51. The optional Boost FunctionTypes tag type may be used to specify cv-qualification.
  52. This means you can add 'const', 'volatile', or both by specifying an appropriate
  53. tag type. An alternate to using the tag type is to specify the enclosing type
  54. as 'const', 'volatile', or both. As an example if you specify the tag type
  55. as 'boost::function_types::const_qualified' or if you specify the enclosing
  56. type as 'const T', the member function which you are introspecting must be
  57. a const function.
  58. </p>
  59. <p>
  60. The second way of invoking the metafunction is by passing it a single parameter,
  61. which is a pointer to member function. This type has the form of:
  62. </p>
  63. <pre class="programlisting"><span class="identifier">Return_Type</span> <span class="special">(</span> <span class="identifier">Enclosing_Type</span><span class="special">::*</span> <span class="special">)</span> <span class="special">(</span> <span class="identifier">Parameter_Types</span> <span class="special">)</span> <span class="identifier">cv_qualifier</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span>
  64. </pre>
  65. <p>
  66. where the Parameter_Types may be empty, or a comma-separated list of parameter
  67. types if there are more than one parameter type. The cv-qualifier may be 'const',
  68. 'volatile', or 'const volatile'.
  69. </p>
  70. <p>
  71. The metafunction returns a single type called 'type', which is a boost::mpl::bool_.
  72. As a convenience the metafunction returns the value of this type directly as
  73. a compile time bool constant called 'value'. This 'value' is true or false
  74. depending on whether the inner member function, of the specified signature,
  75. exists or not.
  76. </p>
  77. <h4>
  78. <a name="the_type_traits_introspection_library.tti_detail_has_member_function.h0"></a>
  79. <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_member_function.generating_the_metafunction"></a></span><a class="link" href="tti_detail_has_member_function.html#the_type_traits_introspection_library.tti_detail_has_member_function.generating_the_metafunction">Generating
  80. the metafunction</a>
  81. </h4>
  82. <p>
  83. You generate the metafunction by invoking the macro with the name of an inner
  84. member function:
  85. </p>
  86. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">AMemberFunction</span><span class="special">)</span>
  87. </pre>
  88. <p>
  89. generates a metafunction called 'has_member_function_AMemberFunction' in the
  90. current scope.
  91. </p>
  92. <h4>
  93. <a name="the_type_traits_introspection_library.tti_detail_has_member_function.h1"></a>
  94. <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_member_function.invoking_the_metafunction"></a></span><a class="link" href="tti_detail_has_member_function.html#the_type_traits_introspection_library.tti_detail_has_member_function.invoking_the_metafunction">Invoking
  95. the metafunction</a>
  96. </h4>
  97. <p>
  98. You invoke the metafunction by instantiating the template with an enclosing
  99. type to introspect and the signature of the member function as a series of
  100. template parameters. Alternatively you can invoke the metafunction by passing
  101. it a single type which is a pointer to member function.
  102. </p>
  103. <p>
  104. A return value called 'value' is a compile time bool constant.
  105. </p>
  106. <pre class="programlisting"><span class="identifier">has_member_function_AMemberFunction</span>
  107. <span class="special">&lt;</span>
  108. <span class="identifier">Enclosing_Type</span><span class="special">,</span>
  109. <span class="identifier">MemberFunction_ReturnType</span><span class="special">,</span>
  110. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">MemberFunction_ParameterTypes</span><span class="special">&gt;,</span> <span class="comment">// optional, can be any mpl forward sequence</span>
  111. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_types</span><span class="special">::</span><span class="identifier">SomeTagType</span> <span class="comment">// optional, can be any FunctionTypes tag type</span>
  112. <span class="special">&gt;::</span><span class="identifier">value</span>
  113. <span class="identifier">OR</span>
  114. <span class="identifier">has_member_function_AMemberFunction</span>
  115. <span class="special">&lt;</span>
  116. <span class="identifier">MemberFunction_ReturnType</span> <span class="special">(</span><span class="identifier">Enclosing_Type</span><span class="special">::*)</span> <span class="special">(</span><span class="identifier">MemberFunction_ParameterTypes</span><span class="special">)</span> <span class="identifier">optional_cv_qualification</span>
  117. <span class="special">&gt;::</span><span class="identifier">value</span>
  118. </pre>
  119. <h4>
  120. <a name="the_type_traits_introspection_library.tti_detail_has_member_function.h2"></a>
  121. <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_member_function.examples"></a></span><a class="link" href="tti_detail_has_member_function.html#the_type_traits_introspection_library.tti_detail_has_member_function.examples">Examples</a>
  122. </h4>
  123. <p>
  124. First we generate metafunctions for various inner member function names:
  125. </p>
  126. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">tti</span><span class="special">/</span><span class="identifier">has_member_function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  127. <span class="identifier">BOOST_TTI_HAS_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">function1</span><span class="special">)</span>
  128. <span class="identifier">BOOST_TTI_HAS_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">function2</span><span class="special">)</span>
  129. <span class="identifier">BOOST_TTI_HAS_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">function3</span><span class="special">)</span>
  130. </pre>
  131. <p>
  132. Next let us create some user-defined types we want to introspect.
  133. </p>
  134. <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">AClass</span>
  135. <span class="special">{</span>
  136. <span class="special">};</span>
  137. <span class="keyword">struct</span> <span class="identifier">Top</span>
  138. <span class="special">{</span>
  139. <span class="keyword">int</span> <span class="identifier">function1</span><span class="special">();</span>
  140. <span class="identifier">AClass</span> <span class="identifier">function2</span><span class="special">(</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">short</span> <span class="special">*);</span>
  141. <span class="special">};</span>
  142. <span class="keyword">struct</span> <span class="identifier">Top2</span>
  143. <span class="special">{</span>
  144. <span class="keyword">long</span> <span class="identifier">function2</span><span class="special">(</span><span class="identifier">Top</span> <span class="special">&amp;,</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">bool</span><span class="special">,</span><span class="keyword">short</span><span class="special">,</span><span class="keyword">float</span><span class="special">);</span>
  145. <span class="identifier">Top</span> <span class="special">*</span> <span class="identifier">function3</span><span class="special">(</span><span class="keyword">long</span><span class="special">,</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">AClass</span> <span class="special">&amp;);</span>
  146. <span class="special">};</span>
  147. </pre>
  148. <p>
  149. Finally we invoke our metafunction and return our value. This all happens at
  150. compile time, and can be used by programmers doing compile time template metaprogramming.
  151. </p>
  152. <p>
  153. We will show both forms in the following examples. Both forms are completely
  154. interchangeable as to the result desired.
  155. </p>
  156. <pre class="programlisting"><span class="identifier">has_member_function_function1</span><span class="special">&lt;</span><span class="identifier">Top</span><span class="special">,</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  157. <span class="identifier">has_member_function_function1</span><span class="special">&lt;</span><span class="identifier">Top</span><span class="special">,</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;&gt;</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  158. <span class="identifier">has_member_function_function1</span><span class="special">&lt;</span><span class="identifier">Top2</span><span class="special">,</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  159. <span class="identifier">has_member_function_function2</span><span class="special">&lt;</span><span class="identifier">AClass</span> <span class="special">(</span><span class="identifier">Top</span><span class="special">::*)</span> <span class="special">(</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">short</span> <span class="special">*)&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  160. <span class="identifier">has_member_function_function2</span><span class="special">&lt;</span><span class="identifier">AClass</span> <span class="special">(</span><span class="identifier">Top2</span><span class="special">::*)</span> <span class="special">(</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">short</span> <span class="special">*)&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  161. <span class="identifier">has_member_function_function2</span><span class="special">&lt;</span><span class="keyword">long</span> <span class="special">(</span><span class="identifier">Top2</span><span class="special">::*)</span> <span class="special">(</span><span class="identifier">Top</span> <span class="special">&amp;,</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">bool</span><span class="special">,</span><span class="keyword">short</span><span class="special">,</span><span class="keyword">float</span><span class="special">)&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  162. <span class="identifier">has_member_function_function3</span><span class="special">&lt;</span><span class="keyword">int</span> <span class="special">(</span><span class="identifier">Top2</span><span class="special">::*)</span> <span class="special">()&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  163. <span class="identifier">has_member_function_function3</span><span class="special">&lt;</span><span class="identifier">Top2</span><span class="special">,</span><span class="identifier">Top</span> <span class="special">*,</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">long</span><span class="special">,</span><span class="keyword">int</span><span class="special">,</span><span class="identifier">AClass</span> <span class="special">&amp;&gt;</span> <span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true;</span>
  164. </pre>
  165. <h4>
  166. <a name="the_type_traits_introspection_library.tti_detail_has_member_function.h3"></a>
  167. <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_member_function.metafunction_re_use"></a></span><a class="link" href="tti_detail_has_member_function.html#the_type_traits_introspection_library.tti_detail_has_member_function.metafunction_re_use">Metafunction
  168. re-use</a>
  169. </h4>
  170. <p>
  171. The macro encodes only the name of the member function for which we are searching
  172. and the fact that we are introspecting for a member function within an enclosing
  173. type.
  174. </p>
  175. <p>
  176. Because of this, once we create our metafunction for introspecting a member
  177. function by name, we can reuse the metafunction for introspecting any enclosing
  178. type, having any member function, for that name.
  179. </p>
  180. </div>
  181. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  182. <td align="left"></td>
  183. <td align="right"><div class="copyright-footer">Copyright &#169; 2011-2013 Tropic Software
  184. East Inc<p>
  185. Distributed under the Boost Software License, Version 1.0. (See accompanying
  186. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  187. </p>
  188. </div></td>
  189. </tr></table>
  190. <hr>
  191. <div class="spirit-nav">
  192. <a accesskey="p" href="tti_detail_has_member_data.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="tti_detail_has_static_member_data.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  193. </div>
  194. </body>
  195. </html>