tti_detail_has_template_metafunction.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Using the has_template_(xxx) metafunction</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="../tti_detail_has_template.html" title="Introspecting an inner class template">
  9. <link rel="prev" href="../tti_detail_has_template.html" title="Introspecting an inner class template">
  10. <link rel="next" href="../tti_detail_has_member_data.html" title="Introspecting 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_template.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../tti_detail_has_template.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_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><h3 class="title">
  27. <a name="the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction"></a><a class="link" href="tti_detail_has_template_metafunction.html" title="Using the has_template_(xxx) metafunction">Using
  28. the has_template_(xxx) metafunction</a>
  29. </h3></div></div></div>
  30. <h5>
  31. <a name="the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.h0"></a>
  32. <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.generating_the_metafunction"></a></span><a class="link" href="tti_detail_has_template_metafunction.html#the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.generating_the_metafunction">Generating
  33. the metafunction</a>
  34. </h5>
  35. <p>
  36. You generate the metafunction by invoking the macro with the name of an inner
  37. class template:
  38. </p>
  39. <pre class="programlisting"><span class="comment">// `template type parameters` form</span>
  40. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">AClassTemplate</span><span class="special">,</span><span class="identifier">BOOST_PP_NIL</span><span class="special">)</span> <span class="comment">// non-variadic macro</span>
  41. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">AClassTemplate</span><span class="special">)</span> <span class="comment">// variadic macro</span>
  42. <span class="comment">// `specific parameters` form</span>
  43. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">AClassTemplate</span><span class="special">,(</span><span class="number">2</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="comment">// non-variadic macro</span>
  44. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">AClassTemplate</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="comment">// variadic macro</span>
  45. </pre>
  46. <p>
  47. generates a metafunction called 'has_template_AClassTemplate' in the current
  48. scope.
  49. </p>
  50. <p>
  51. If you want to introspect the same class template name using both the <code class="computeroutput"><span class="keyword">template</span> <span class="identifier">type</span>
  52. <span class="identifier">parameters</span></code> form and the <code class="computeroutput"><span class="identifier">specific</span> <span class="identifier">parameters</span></code>
  53. form you will have the problem that you will be generating a metafunction
  54. of the same name and violating the C++ ODR rule. In this particular case
  55. you can use the alternate BOOST_TTI_TRAIT_HAS_TEMPLATE macro to name the
  56. particular metafunction which will be generated.
  57. </p>
  58. <h5>
  59. <a name="the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.h1"></a>
  60. <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.invoking_the_metafunction"></a></span><a class="link" href="tti_detail_has_template_metafunction.html#the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.invoking_the_metafunction">Invoking
  61. the metafunction</a>
  62. </h5>
  63. <p>
  64. You invoke the metafunction by instantiating the template with an enclosing
  65. type to introspect. A return value called 'value' is a compile time bool
  66. constant.
  67. </p>
  68. <pre class="programlisting"><span class="identifier">has_template_AType</span><span class="special">&lt;</span><span class="identifier">Enclosing_Type</span><span class="special">&gt;::</span><span class="identifier">value</span>
  69. </pre>
  70. <h5>
  71. <a name="the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.h2"></a>
  72. <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.examples"></a></span><a class="link" href="tti_detail_has_template_metafunction.html#the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.examples">Examples</a>
  73. </h5>
  74. <p>
  75. First we generate metafunctions for various inner class template names:
  76. </p>
  77. <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_template</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  78. <span class="comment">// Using variadic macro, `template type parameters`</span>
  79. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template1</span><span class="special">)</span>
  80. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template2</span><span class="special">)</span>
  81. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template3</span><span class="special">)</span>
  82. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template4</span><span class="special">)</span>
  83. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template5</span><span class="special">)</span>
  84. <span class="comment">// or using non-variadic macro, `template type parameters`</span>
  85. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template1</span><span class="special">,</span><span class="identifier">BOOST_PP_NIL</span><span class="special">)</span>
  86. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template2</span><span class="special">,</span><span class="identifier">BOOST_PP_NIL</span><span class="special">)</span>
  87. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template3</span><span class="special">,</span><span class="identifier">BOOST_PP_NIL</span><span class="special">)</span>
  88. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template4</span><span class="special">,</span><span class="identifier">BOOST_PP_NIL</span><span class="special">)</span>
  89. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template5</span><span class="special">,</span><span class="identifier">BOOST_PP_NIL</span><span class="special">)</span>
  90. <span class="comment">// Using variadic macro, `specific parameters`</span>
  91. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template6</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">int</span><span class="special">)</span>
  92. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template7</span><span class="special">,</span><span class="keyword">typename</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">class</span><span class="special">&gt;</span> <span class="keyword">struct</span><span class="special">,</span><span class="keyword">long</span><span class="special">)</span>
  93. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template8</span><span class="special">,</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">typename</span><span class="special">)</span>
  94. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template9</span><span class="special">,</span><span class="keyword">typename</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">typename</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">typename</span><span class="special">,</span><span class="keyword">short</span><span class="special">)</span>
  95. <span class="comment">// or using non-variadic macro, `specific parameters`</span>
  96. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template6</span><span class="special">,(</span><span class="number">2</span><span class="special">,(</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">int</span><span class="special">)))</span>
  97. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template7</span><span class="special">,(</span><span class="number">4</span><span class="special">,(</span><span class="keyword">typename</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">class</span><span class="special">&gt;</span> <span class="keyword">struct</span><span class="special">,</span><span class="keyword">long</span><span class="special">)))</span>
  98. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template8</span><span class="special">,(</span><span class="number">2</span><span class="special">,(</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">typename</span><span class="special">)))</span>
  99. <span class="identifier">BOOST_TTI_HAS_TEMPLATE</span><span class="special">(</span><span class="identifier">Template9</span><span class="special">,(</span><span class="number">6</span><span class="special">,(</span><span class="keyword">typename</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">typename</span><span class="special">,</span><span class="keyword">class</span><span class="special">,</span><span class="keyword">typename</span><span class="special">,</span><span class="keyword">short</span><span class="special">)))</span>
  100. </pre>
  101. <p>
  102. Next let us create some user-defined types we want to introspect.
  103. </p>
  104. <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Top</span>
  105. <span class="special">{</span>
  106. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">Template1</span> <span class="special">{</span> <span class="special">};</span>
  107. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">B</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">Template2</span> <span class="special">{</span> <span class="special">};</span>
  108. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">B</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">,</span><span class="keyword">int</span> <span class="identifier">D</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">Template3</span> <span class="special">{</span> <span class="special">};</span>
  109. <span class="special">};</span>
  110. <span class="keyword">struct</span> <span class="identifier">Top2</span>
  111. <span class="special">{</span>
  112. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">B</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">Template3</span> <span class="special">{</span> <span class="special">};</span>
  113. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Y</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">Template4</span> <span class="special">{</span> <span class="special">};</span>
  114. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">B</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">Template5</span> <span class="special">{</span> <span class="special">};</span>
  115. <span class="special">};</span>
  116. <span class="keyword">struct</span> <span class="identifier">Top3</span>
  117. <span class="special">{</span>
  118. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">X</span><span class="special">,</span><span class="keyword">int</span> <span class="identifier">Y</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">Template6</span> <span class="special">{</span> <span class="special">};</span>
  119. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</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">class</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">B</span><span class="special">,</span><span class="keyword">long</span> <span class="identifier">C</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">Template7</span> <span class="special">{</span> <span class="special">};</span>
  120. <span class="special">};</span>
  121. <span class="keyword">struct</span> <span class="identifier">Top4</span>
  122. <span class="special">{</span>
  123. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">double</span> <span class="identifier">X</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">Y</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">Template8</span> <span class="special">{</span> <span class="special">};</span>
  124. <span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">A</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">B</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">C</span><span class="special">,</span><span class="keyword">class</span> <span class="identifier">D</span><span class="special">,</span><span class="keyword">typename</span> <span class="identifier">E</span><span class="special">,</span><span class="keyword">short</span> <span class="identifier">F</span><span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">Template9</span> <span class="special">{</span> <span class="special">};</span>
  125. <span class="special">};</span>
  126. </pre>
  127. <p>
  128. Finally we invoke our metafunction and return our value. This all happens
  129. at compile time, and can be used by programmers doing compile time template
  130. metaprogramming.
  131. </p>
  132. <pre class="programlisting"><span class="identifier">has_template_Template1</span><span class="special">&lt;</span><span class="identifier">Top</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  133. <span class="identifier">has_template_Template1</span><span class="special">&lt;</span><span class="identifier">Top2</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  134. <span class="identifier">has_template_Template2</span><span class="special">&lt;</span><span class="identifier">Top</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  135. <span class="identifier">has_template_Template2</span><span class="special">&lt;</span><span class="identifier">Top2</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  136. <span class="identifier">has_template_Template3</span><span class="special">&lt;</span><span class="identifier">Top</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false, not all typename/class template parameters</span>
  137. <span class="identifier">has_template_Template3</span><span class="special">&lt;</span><span class="identifier">Top2</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  138. <span class="identifier">has_template_Template4</span><span class="special">&lt;</span><span class="identifier">Top</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  139. <span class="identifier">has_template_Template4</span><span class="special">&lt;</span><span class="identifier">Top2</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  140. <span class="identifier">has_template_Template5</span><span class="special">&lt;</span><span class="identifier">Top</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  141. <span class="identifier">has_template_Template5</span><span class="special">&lt;</span><span class="identifier">Top2</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  142. <span class="identifier">has_template_Template6</span><span class="special">&lt;</span><span class="identifier">Top3</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  143. <span class="identifier">has_template_Template6</span><span class="special">&lt;</span><span class="identifier">Top4</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  144. <span class="identifier">has_template_Template7</span><span class="special">&lt;</span><span class="identifier">Top3</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  145. <span class="identifier">has_template_Template7</span><span class="special">&lt;</span><span class="identifier">Top4</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  146. <span class="identifier">has_template_Template8</span><span class="special">&lt;</span><span class="identifier">Top3</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  147. <span class="identifier">has_template_Template8</span><span class="special">&lt;</span><span class="identifier">Top4</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  148. <span class="identifier">has_template_Template9</span><span class="special">&lt;</span><span class="identifier">Top3</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// false</span>
  149. <span class="identifier">has_template_Template9</span><span class="special">&lt;</span><span class="identifier">Top4</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">;</span> <span class="comment">// true</span>
  150. </pre>
  151. <h5>
  152. <a name="the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.h3"></a>
  153. <span class="phrase"><a name="the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.metafunction_re_use"></a></span><a class="link" href="tti_detail_has_template_metafunction.html#the_type_traits_introspection_library.tti_detail_has_template.tti_detail_has_template_metafunction.metafunction_re_use">Metafunction
  154. re-use</a>
  155. </h5>
  156. <p>
  157. The macro encodes the name of the inner class template for which we are searching,
  158. the fact that we are introspecting for a class template within an enclosing
  159. type, and optionally the template parameters for that class template.
  160. </p>
  161. <p>
  162. Once we create our metafunction for introspecting an inner class template
  163. by name, we can reuse the metafunction for introspecting any enclosing type,
  164. having any inner class template, for that name.
  165. </p>
  166. <p>
  167. However we need to understand that we are restricted in our reuse of the
  168. metafunction by whether we originally use the template type parameters form
  169. or the specific form. In either case we are always introspecting an inner
  170. class template which matches that form. In the case of the template type
  171. parameters form, any inner class template for which we are introspecting
  172. must have all template type parameters, as well as the correct name. In the
  173. case of the specific parameters form, any inner class template for which
  174. we are introspecting must have template parameters which match the specific
  175. template parameters passed to the macro, as well as the correct name.
  176. </p>
  177. </div>
  178. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  179. <td align="left"></td>
  180. <td align="right"><div class="copyright-footer">Copyright &#169; 2011-2013 Tropic Software
  181. East Inc<p>
  182. Distributed under the Boost Software License, Version 1.0. (See accompanying
  183. 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>)
  184. </p>
  185. </div></td>
  186. </tr></table>
  187. <hr>
  188. <div class="spirit-nav">
  189. <a accesskey="p" href="../tti_detail_has_template.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../tti_detail_has_template.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_member_data.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  190. </div>
  191. </body>
  192. </html>