tti_usingMM.html 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>An example using the Macro Metafunctions</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_enclosing_type.html" title="Enclosing Type">
  10. <link rel="next" href="tti_func_templates.html" title="Introspecting Function Templates">
  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_enclosing_type.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_func_templates.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_usingMM"></a><a class="link" href="tti_usingMM.html" title="An example using the Macro Metafunctions">An example
  28. using the Macro Metafunctions</a>
  29. </h2></div></div></div>
  30. <p>
  31. <a name="sectti_usingMM"></a>Using the macro metafunctions can be illustrated
  32. by first creating some hypothetical user-defined type with corresponding nested
  33. types and other inner elements. With this type we can illustrate the use of
  34. the macro metafunctions. This is just meant to serve as a model for what a
  35. type T might entail from within a class or function template where 'T' is a
  36. type passed to the template.
  37. </p>
  38. <pre class="programlisting"><span class="comment">// An enclosing type</span>
  39. <span class="keyword">struct</span> <span class="identifier">AType</span>
  40. <span class="special">{</span>
  41. <span class="comment">// Type</span>
  42. <span class="keyword">typedef</span> <span class="keyword">int</span> <span class="identifier">AnIntType</span><span class="special">;</span> <span class="comment">// as a typedef</span>
  43. <span class="keyword">struct</span> <span class="identifier">BType</span> <span class="comment">// as a nested type</span>
  44. <span class="special">{</span>
  45. <span class="keyword">struct</span> <span class="identifier">CType</span>
  46. <span class="special">{</span>
  47. <span class="special">};</span>
  48. <span class="special">};</span>
  49. <span class="comment">// Template</span>
  50. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">AMemberTemplate</span> <span class="special">{</span> <span class="special">};</span>
  51. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">AnotherMemberTemplate</span> <span class="special">{</span> <span class="special">};</span>
  52. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span><span class="special">&gt;</span> <span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">long</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">ManyParameters</span> <span class="special">{</span> <span class="special">};</span>
  53. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">short</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">MoreParameters</span> <span class="special">{</span> <span class="special">};</span>
  54. <span class="comment">// Data</span>
  55. <span class="identifier">BType</span> <span class="identifier">IntBT</span><span class="special">;</span>
  56. <span class="comment">// Function</span>
  57. <span class="keyword">int</span> <span class="identifier">IntFunction</span><span class="special">(</span><span class="keyword">short</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> <span class="special">}</span>
  58. <span class="comment">// Static Data</span>
  59. <span class="keyword">static</span> <span class="keyword">short</span> <span class="identifier">DSMember</span><span class="special">;</span>
  60. <span class="comment">// Static Function</span>
  61. <span class="keyword">static</span> <span class="keyword">int</span> <span class="identifier">SIntFunction</span><span class="special">(</span><span class="keyword">long</span><span class="special">,</span><span class="keyword">double</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="number">2</span><span class="special">;</span> <span class="special">}</span>
  62. <span class="special">};</span>
  63. </pre>
  64. <p>
  65. I will be using the type above just to illustrate the sort of metaprogramming
  66. questions we can ask of some type T which is passed to the template programmer
  67. in a class template. Here is what the class template might look like:
  68. </p>
  69. <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">tti</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  70. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
  71. <span class="keyword">struct</span> <span class="identifier">OurTemplateClass</span>
  72. <span class="special">{</span>
  73. <span class="comment">// compile-time template code regarding T</span>
  74. <span class="special">};</span>
  75. </pre>
  76. <p>
  77. Now let us create and invoke the macro metafunctions for each of our inner
  78. element types, to see if type T above corresponds to our hypothetical type
  79. above. Imagine this being within 'OurTemplateClass' above. In the examples
  80. below the same macro is invoked just once to avoid ODR violations.
  81. </p>
  82. <h4>
  83. <a name="the_type_traits_introspection_library.tti_usingMM.h0"></a>
  84. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.type"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.type">Type</a>
  85. </h4>
  86. <p>
  87. Does T have a nested type called 'AnIntType' ?
  88. </p>
  89. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_TYPE</span><span class="special">(</span><span class="identifier">AnIntType</span><span class="special">)</span>
  90. <span class="identifier">has_type_AnIntType</span>
  91. <span class="special">&lt;</span>
  92. <span class="identifier">T</span>
  93. <span class="special">&gt;</span>
  94. </pre>
  95. <p>
  96. Does T have a nested type called 'BType' ?
  97. </p>
  98. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_TYPE</span><span class="special">(</span><span class="identifier">BType</span><span class="special">)</span>
  99. <span class="identifier">has_type_BType</span>
  100. <span class="special">&lt;</span>
  101. <span class="identifier">T</span>
  102. <span class="special">&gt;</span>
  103. </pre>
  104. <h4>
  105. <a name="the_type_traits_introspection_library.tti_usingMM.h1"></a>
  106. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.type_checking_the_typedef_using_a_lambda_expression"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.type_checking_the_typedef_using_a_lambda_expression">Type
  107. checking the typedef using a lambda expression</a>
  108. </h4>
  109. <p>
  110. Does T have a nested typedef called 'AnIntType' whose type is an 'int' ?
  111. </p>
  112. <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">mpl</span><span class="special">/</span><span class="identifier">placeholders</span><span class="special">.</span><span class="identifier">hpp</span>
  113. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">is_same</span><span class="special">.</span><span class="identifier">hpp</span>
  114. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">placeholders</span><span class="special">;</span>
  115. <span class="identifier">has_type_AnIntType</span>
  116. <span class="special">&lt;</span>
  117. <span class="identifier">T</span><span class="special">,</span>
  118. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_same</span><span class="special">&lt;</span><span class="identifier">_1</span><span class="special">,</span><span class="keyword">int</span><span class="special">&gt;</span>
  119. <span class="special">&gt;</span>
  120. </pre>
  121. <h4>
  122. <a name="the_type_traits_introspection_library.tti_usingMM.h2"></a>
  123. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.template"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.template">Template</a>
  124. </h4>
  125. <p>
  126. Does T have a nested class template called 'AMemberTemplate' whose template
  127. parameters are all types ('class' or 'typename') ?
  128. </p>
  129. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">AMemberTemplate</span><span class="special">,</span><span class="identifier">BOOST_PP_NIL</span><span class="special">)</span>
  130. <span class="identifier">has_template_AMemberTemplate</span>
  131. <span class="special">&lt;</span>
  132. <span class="identifier">T</span>
  133. <span class="special">&gt;</span>
  134. </pre>
  135. <h4>
  136. <a name="the_type_traits_introspection_library.tti_usingMM.h3"></a>
  137. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.template_using_variadic_macros"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.template_using_variadic_macros">Template
  138. using variadic macros</a>
  139. </h4>
  140. <p>
  141. Does T have a nested class template called 'AMemberTemplate' whose template
  142. parameters are all types ('class' or 'typename') ?
  143. </p>
  144. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">AnotherMemberTemplate</span><span class="special">)</span>
  145. <span class="identifier">has_template_AnotherMemberTemplate</span>
  146. <span class="special">&lt;</span>
  147. <span class="identifier">T</span>
  148. <span class="special">&gt;</span>
  149. </pre>
  150. <h4>
  151. <a name="the_type_traits_introspection_library.tti_usingMM.h4"></a>
  152. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.template_with_params"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.template_with_params">Template
  153. with params</a>
  154. </h4>
  155. <p>
  156. Does T have a nested class template called 'MoreParameters' whose template
  157. parameters are specified exactly ?
  158. </p>
  159. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">MoreParameters</span><span class="special">,(</span><span class="number">8</span><span class="special">,(</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">short</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">)))</span>
  160. <span class="identifier">has_template_MoreParameters</span>
  161. <span class="special">&lt;</span>
  162. <span class="identifier">T</span>
  163. <span class="special">&gt;</span>
  164. </pre>
  165. <h4>
  166. <a name="the_type_traits_introspection_library.tti_usingMM.h5"></a>
  167. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.template_with_params_using_variadic_macros"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.template_with_params_using_variadic_macros">Template
  168. with params using variadic macros</a>
  169. </h4>
  170. <p>
  171. Does T have a nested class template called 'ManyParameters' whose template
  172. parameters are specified exactly ?
  173. </p>
  174. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">ManyParameters</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span><span class="special">&gt;</span> <span class="keyword">class</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">long</span><span class="special">)</span>
  175. <span class="identifier">has_template_ManyParameters</span>
  176. <span class="special">&lt;</span>
  177. <span class="identifier">T</span>
  178. <span class="special">&gt;</span>
  179. </pre>
  180. <h4>
  181. <a name="the_type_traits_introspection_library.tti_usingMM.h6"></a>
  182. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.member_data"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.member_data">Member
  183. data</a>
  184. </h4>
  185. <p>
  186. Does T have a member data called 'IntBT' whose type is 'AType::BType' ?
  187. </p>
  188. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_MEMBER_DATA</span><span class="special">(</span><span class="identifier">IntBT</span><span class="special">)</span>
  189. <span class="identifier">has_member_data_IntBT</span>
  190. <span class="special">&lt;</span>
  191. <span class="identifier">T</span><span class="special">,</span>
  192. <span class="identifier">AType</span><span class="special">::</span><span class="identifier">BType</span>
  193. <span class="special">&gt;</span>
  194. </pre>
  195. <h4>
  196. <a name="the_type_traits_introspection_library.tti_usingMM.h7"></a>
  197. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.member_data_with_composite_type"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.member_data_with_composite_type">Member
  198. data with composite type</a>
  199. </h4>
  200. <p>
  201. Does T have a member data called 'IntBT' whose type is 'AType::BType' ?
  202. </p>
  203. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_MEMBER_DATA</span><span class="special">(</span><span class="identifier">IntBT</span><span class="special">)</span>
  204. <span class="identifier">has_member_data_IntBT</span>
  205. <span class="special">&lt;</span>
  206. <span class="identifier">AType</span><span class="special">::</span><span class="identifier">BType</span> <span class="identifier">T</span><span class="special">::*</span>
  207. <span class="special">&gt;</span>
  208. </pre>
  209. <h4>
  210. <a name="the_type_traits_introspection_library.tti_usingMM.h8"></a>
  211. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.member_function_with_individual_types"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.member_function_with_individual_types">Member
  212. function with individual types</a>
  213. </h4>
  214. <p>
  215. Does T have a member function called 'IntFunction' whose type is 'int (short)'
  216. ?
  217. </p>
  218. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">IntFunction</span><span class="special">)</span>
  219. <span class="identifier">has_member_function_IntFunction</span>
  220. <span class="special">&lt;</span>
  221. <span class="identifier">T</span><span class="special">,</span>
  222. <span class="keyword">int</span><span class="special">,</span>
  223. <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">short</span><span class="special">&gt;</span>
  224. <span class="special">&gt;</span>
  225. </pre>
  226. <h4>
  227. <a name="the_type_traits_introspection_library.tti_usingMM.h9"></a>
  228. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.member_function_with_composite_type"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.member_function_with_composite_type">Member
  229. function with composite type</a>
  230. </h4>
  231. <p>
  232. Does T have a member function called 'IntFunction' whose type is 'int (short)'
  233. ?
  234. </p>
  235. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">IntFunction</span><span class="special">)</span>
  236. <span class="identifier">has_member_function_IntFunction</span>
  237. <span class="special">&lt;</span>
  238. <span class="keyword">int</span> <span class="special">(</span><span class="identifier">T</span><span class="special">::*)(</span><span class="keyword">short</span><span class="special">)</span>
  239. <span class="special">&gt;</span>
  240. </pre>
  241. <h4>
  242. <a name="the_type_traits_introspection_library.tti_usingMM.h10"></a>
  243. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.static_member_data"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.static_member_data">Static
  244. member data</a>
  245. </h4>
  246. <p>
  247. Does T have a static member data called 'DSMember' whose type is 'short' ?
  248. </p>
  249. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_STATIC_MEMBER_DATA</span><span class="special">(</span><span class="identifier">DSMember</span><span class="special">)</span>
  250. <span class="identifier">has_static_member_data_DSMember</span>
  251. <span class="special">&lt;</span>
  252. <span class="identifier">T</span><span class="special">,</span>
  253. <span class="keyword">short</span>
  254. <span class="special">&gt;</span>
  255. </pre>
  256. <h4>
  257. <a name="the_type_traits_introspection_library.tti_usingMM.h11"></a>
  258. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.static_member_function_with_individual_types"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.static_member_function_with_individual_types">Static
  259. member function with individual types</a>
  260. </h4>
  261. <p>
  262. Does T have a static member function called 'SIntFunction' whose type is 'int
  263. (long,double)' ?
  264. </p>
  265. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">SIntFunction</span><span class="special">)</span>
  266. <span class="identifier">has_static_member_function_SIntFunction</span>
  267. <span class="special">&lt;</span>
  268. <span class="identifier">T</span><span class="special">,</span>
  269. <span class="keyword">int</span><span class="special">,</span>
  270. <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">double</span><span class="special">&gt;</span>
  271. <span class="special">&gt;</span>
  272. </pre>
  273. <h4>
  274. <a name="the_type_traits_introspection_library.tti_usingMM.h12"></a>
  275. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.static_member_function_with_composite_type"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.static_member_function_with_composite_type">Static
  276. member function with composite type</a>
  277. </h4>
  278. <p>
  279. Does T have a static member function called 'SIntFunction' whose type is 'int
  280. (long,double)' ?
  281. </p>
  282. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION</span><span class="special">(</span><span class="identifier">SIntFunction</span><span class="special">)</span>
  283. <span class="identifier">has_static_member_function_SIntFunction</span>
  284. <span class="special">&lt;</span>
  285. <span class="identifier">T</span><span class="special">,</span>
  286. <span class="keyword">int</span> <span class="special">(</span><span class="keyword">long</span><span class="special">,</span><span class="keyword">double</span><span class="special">)</span>
  287. <span class="special">&gt;</span>
  288. </pre>
  289. <h4>
  290. <a name="the_type_traits_introspection_library.tti_usingMM.h13"></a>
  291. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.data"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.data">Data</a>
  292. </h4>
  293. <p>
  294. Does T have a member data or static member data called 'DSMember' whose type
  295. is 'short' ?
  296. </p>
  297. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_DATA</span><span class="special">(</span><span class="identifier">DSMember</span><span class="special">)</span>
  298. <span class="identifier">has_static_member_data_DSMember</span>
  299. <span class="special">&lt;</span>
  300. <span class="identifier">T</span><span class="special">,</span>
  301. <span class="keyword">short</span>
  302. <span class="special">&gt;</span>
  303. </pre>
  304. <h4>
  305. <a name="the_type_traits_introspection_library.tti_usingMM.h14"></a>
  306. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.function"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.function">Function</a>
  307. </h4>
  308. <p>
  309. Does T have a member function or a static member function called 'IntFunction'
  310. whose type is 'int (short)' ?
  311. </p>
  312. <pre class="programlisting"><span class="identifier">BOOST_TTI_HAS_FUNCTION</span><span class="special">(</span><span class="identifier">IntFunction</span><span class="special">)</span>
  313. <span class="identifier">has_function_IntFunction</span>
  314. <span class="special">&lt;</span>
  315. <span class="identifier">T</span><span class="special">,</span>
  316. <span class="keyword">int</span><span class="special">,</span>
  317. <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">short</span><span class="special">&gt;</span>
  318. <span class="special">&gt;</span>
  319. </pre>
  320. <h4>
  321. <a name="the_type_traits_introspection_library.tti_usingMM.h15"></a>
  322. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.member_type"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.member_type">Member
  323. type</a>
  324. </h4>
  325. <p>
  326. Create a nested type T::BType::CType without creating a compiler error if T
  327. does not have the nested type BType::CType ?
  328. </p>
  329. <pre class="programlisting"><span class="identifier">BOOST_TTI_MEMBER_TYPE</span><span class="special">(</span><span class="identifier">BType</span><span class="special">)</span>
  330. <span class="identifier">BOOST_TTI_MEMBER_TYPE</span><span class="special">(</span><span class="identifier">CType</span><span class="special">)</span>
  331. <span class="keyword">typename</span>
  332. <span class="identifier">member_type_CType</span>
  333. <span class="special">&lt;</span>
  334. <span class="keyword">typename</span>
  335. <span class="identifier">member_type_BType</span>
  336. <span class="special">&lt;</span>
  337. <span class="identifier">T</span>
  338. <span class="special">&gt;::</span><span class="identifier">type</span>
  339. <span class="special">&gt;::</span><span class="identifier">type</span>
  340. </pre>
  341. <h4>
  342. <a name="the_type_traits_introspection_library.tti_usingMM.h16"></a>
  343. <span class="phrase"><a name="the_type_traits_introspection_library.tti_usingMM.member_type_existence"></a></span><a class="link" href="tti_usingMM.html#the_type_traits_introspection_library.tti_usingMM.member_type_existence">Member
  344. type existence</a>
  345. </h4>
  346. <p>
  347. Does a nested type T::BType::CType, created without creating a compiler error
  348. if T does not have the nested type BType::CType, actually exist ?
  349. </p>
  350. <pre class="programlisting"><span class="identifier">BOOST_TTI_MEMBER_TYPE</span><span class="special">(</span><span class="identifier">BType</span><span class="special">)</span>
  351. <span class="identifier">BOOST_TTI_MEMBER_TYPE</span><span class="special">(</span><span class="identifier">CType</span><span class="special">)</span>
  352. <span class="keyword">typedef</span> <span class="keyword">typename</span>
  353. <span class="identifier">member_type_CType</span>
  354. <span class="special">&lt;</span>
  355. <span class="keyword">typename</span>
  356. <span class="identifier">member_type_BType</span>
  357. <span class="special">&lt;</span>
  358. <span class="identifier">T</span>
  359. <span class="special">&gt;::</span><span class="identifier">type</span>
  360. <span class="special">&gt;::</span><span class="identifier">type</span>
  361. <span class="identifier">AType</span><span class="special">;</span>
  362. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">tti</span><span class="special">::</span><span class="identifier">valid_member_type</span>
  363. <span class="special">&lt;</span>
  364. <span class="identifier">AType</span>
  365. <span class="special">&gt;</span>
  366. </pre>
  367. </div>
  368. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  369. <td align="left"></td>
  370. <td align="right"><div class="copyright-footer">Copyright &#169; 2011-2013 Tropic Software
  371. East Inc<p>
  372. Distributed under the Boost Software License, Version 1.0. (See accompanying
  373. 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>)
  374. </p>
  375. </div></td>
  376. </tr></table>
  377. <hr>
  378. <div class="spirit-nav">
  379. <a accesskey="p" href="tti_enclosing_type.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_func_templates.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  380. </div>
  381. </body>
  382. </html>