vmd_identity.html 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Generating emptiness and identity</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 Variadic Macro Data Library 1.9">
  8. <link rel="up" href="../vmd_useful.html" title="Useful variadic macros not in Boost PP">
  9. <link rel="prev" href="../vmd_useful.html" title="Useful variadic macros not in Boost PP">
  10. <link rel="next" href="vmd_empty_ppdata.html" title='Functionality for "empty" seqs and tuples'>
  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="../vmd_useful.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../vmd_useful.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="vmd_empty_ppdata.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="variadic_macro_data.vmd_useful.vmd_identity"></a><a class="link" href="vmd_identity.html" title="Generating emptiness and identity">Generating
  28. emptiness and identity</a>
  29. </h3></div></div></div>
  30. <h5>
  31. <a name="variadic_macro_data.vmd_useful.vmd_identity.h0"></a>
  32. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_identity.using_boost_pp_empty_and_boost_p"></a></span><a class="link" href="vmd_identity.html#variadic_macro_data.vmd_useful.vmd_identity.using_boost_pp_empty_and_boost_p">Using
  33. BOOST_PP_EMPTY and BOOST_PP_IDENTITY</a>
  34. </h5>
  35. <p>
  36. Boost PP Has a macro called BOOST_PP_EMPTY() which expands to nothing.
  37. </p>
  38. <p>
  39. Ordinarily this would not seem that useful, but the macro can be used in
  40. situations where one wants to return a specific value even though a further
  41. macro call syntax is required taking no parameters. This sort of usefulness
  42. occurs in Boost PP when there are two paths to take depending on the outcome
  43. of a BOOST_PP_IF or BOOST_PP_IIF logic. Here is an artificial example:
  44. </p>
  45. <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">preprocessor</span><span class="special">/</span><span class="identifier">control</span><span class="special">/</span><span class="identifier">iif</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  46. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">preprocessor</span><span class="special">/</span><span class="identifier">facilities</span><span class="special">/</span><span class="identifier">empty</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  47. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter</span><span class="special">)</span> <span class="special">\</span>
  48. <span class="identifier">BOOST_PP_IIF</span><span class="special">(</span><span class="identifier">parameter</span><span class="special">)</span> <span class="special">\</span>
  49. <span class="special">(</span> <span class="special">\</span>
  50. <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">,</span> <span class="special">\</span>
  51. <span class="identifier">SOME_FIXED_VALUE</span> <span class="identifier">BOOST_PP_EMPTY</span> <span class="special">\</span>
  52. <span class="special">)</span> <span class="special">\</span>
  53. <span class="special">()</span>
  54. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">()</span> <span class="identifier">some_processing</span>
  55. </pre>
  56. <p>
  57. In the general logic above is: if parameter is 1 another macro is invoked,
  58. whereas if the parameter is 0 some fixed value is returned. The reason that
  59. this is useful is that one may not want to code the MACRO_CHOICE macro in
  60. this way:
  61. </p>
  62. <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">preprocessor</span><span class="special">/</span><span class="identifier">control</span><span class="special">/</span><span class="identifier">iif</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  63. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter</span><span class="special">)</span> <span class="special">\</span>
  64. <span class="identifier">BOOST_PP_IIF</span><span class="special">(</span><span class="identifier">parameter</span><span class="special">)</span> <span class="special">\</span>
  65. <span class="special">(</span> <span class="special">\</span>
  66. <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">(),</span> <span class="special">\</span>
  67. <span class="identifier">SOME_FIXED_VALUE</span> <span class="special">\</span>
  68. <span class="special">)</span>
  69. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">()</span> <span class="identifier">some_processing</span>
  70. </pre>
  71. <p>
  72. because it is inefficient. The invocation of MACRO_CALL_IF_PARAMETER_1 will
  73. still be generated even when 'parameter' is 0.
  74. </p>
  75. <p>
  76. This idiom of returning a fixed value through the use of BOOST_PP_EMPTY is
  77. so useful that Boost PP has an accompanying macro to BOOST_PP_EMPTY to work
  78. with it. This accompanying macro is BOOST_PP_IDENTITY(value)(). Essentially
  79. BOOST_PP_IDENTITY returns its value when it is invoked. Again, like BOOST_PP_EMPTY,
  80. the final invocation must be done with no value.
  81. </p>
  82. <p>
  83. Our example from above, which originally used BOOST_PP_EMPTY to return a
  84. fixed value, is now:
  85. </p>
  86. <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">preprocessor</span><span class="special">/</span><span class="identifier">control</span><span class="special">/</span><span class="identifier">iif</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  87. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">preprocessor</span><span class="special">/</span><span class="identifier">facilities</span><span class="special">/</span><span class="identifier">identity</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  88. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter</span><span class="special">)</span> <span class="special">\</span>
  89. <span class="identifier">BOOST_PP_IIF</span><span class="special">(</span><span class="identifier">parameter</span><span class="special">)</span> <span class="special">\</span>
  90. <span class="special">(</span> <span class="special">\</span>
  91. <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">,</span> <span class="special">\</span>
  92. <span class="identifier">BOOST_PP_IDENTITY</span><span class="special">(</span><span class="identifier">SOME_FIXED_VALUE</span><span class="special">)</span> <span class="special">\</span>
  93. <span class="special">)</span> <span class="special">\</span>
  94. <span class="special">()</span>
  95. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">()</span> <span class="identifier">some_processing</span>
  96. </pre>
  97. <p>
  98. The macro BOOST_PP_IDENTITY is actually just:
  99. </p>
  100. <pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_PP_IDENTITY</span><span class="special">(</span><span class="identifier">value</span><span class="special">)</span> <span class="identifier">value</span> <span class="identifier">BOOST_PP_EMPTY</span>
  101. </pre>
  102. <p>
  103. so you can see how it is essentially a shorthand for the common case originally
  104. shown at the top of returning a value through the use of BOOST_PP_EMPTY.
  105. </p>
  106. <h5>
  107. <a name="variadic_macro_data.vmd_useful.vmd_identity.h1"></a>
  108. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_identity.using_boost_vmd_empty_and_boost_"></a></span><a class="link" href="vmd_identity.html#variadic_macro_data.vmd_useful.vmd_identity.using_boost_vmd_empty_and_boost_">Using
  109. BOOST_VMD_EMPTY and BOOST_VMD_IDENTITY</a>
  110. </h5>
  111. <p>
  112. The one problem when using BOOST_PP_EMPTY and BOOST_PP_IDENTITY is that the
  113. final invocation must be with no parameters. This is very limiting. If the
  114. final invocation must be with one or more parameters you cannot use BOOST_PP_EMPTY
  115. or BOOST_PP_IDENTITY. In other words, making a change to either of our two
  116. examples:
  117. </p>
  118. <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">preprocessor</span><span class="special">/</span><span class="identifier">control</span><span class="special">/</span><span class="identifier">iif</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  119. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">preprocessor</span><span class="special">/</span><span class="identifier">facilities</span><span class="special">/</span><span class="identifier">empty</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  120. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">,</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="special">\</span>
  121. <span class="identifier">BOOST_PP_IIF</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">)</span> <span class="special">\</span>
  122. <span class="special">(</span> <span class="special">\</span>
  123. <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">,</span> <span class="special">\</span>
  124. <span class="identifier">SOME_FIXED_VALUE</span> <span class="identifier">BOOST_PP_EMPTY</span> <span class="special">\</span>
  125. <span class="special">)</span> <span class="special">\</span>
  126. <span class="special">(</span><span class="identifier">parameter2</span><span class="special">)</span>
  127. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">(</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="identifier">some_processing_using_a_parameter</span>
  128. </pre>
  129. <p>
  130. or
  131. </p>
  132. <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">preprocessor</span><span class="special">/</span><span class="identifier">control</span><span class="special">/</span><span class="identifier">iif</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  133. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">preprocessor</span><span class="special">/</span><span class="identifier">facilities</span><span class="special">/</span><span class="identifier">identity</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  134. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">,</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="special">\</span>
  135. <span class="identifier">BOOST_PP_IIF</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">)</span> <span class="special">\</span>
  136. <span class="special">(</span> <span class="special">\</span>
  137. <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">,</span> <span class="special">\</span>
  138. <span class="identifier">BOOST_PP_IDENTITY</span><span class="special">(</span><span class="identifier">SOME_FIXED_VALUE</span><span class="special">)</span> <span class="special">\</span>
  139. <span class="special">)</span> <span class="special">\</span>
  140. <span class="special">(</span><span class="identifier">parameter2</span><span class="special">)</span>
  141. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">(</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="identifier">some_processing_using_a_parameter</span>
  142. </pre>
  143. <p>
  144. will produce a preprocessing error since the final invocation to either BOOST_PP_EMPTY
  145. or BOOST_PP_IDENTITY can not be done with 1 or more parameters.
  146. </p>
  147. <p>
  148. It would be much more useful if the final invocation could be done with any
  149. number of parameters. This is where using variadic macros solves the problem.
  150. The BOOST_VMD_EMPTY and BOOST_VMD_IDENTITY macros have the exact same functionality
  151. as their Boost PP counterparts but the final invocation can be made with
  152. any number of parameters, and those parameters are just ignored when BOOST_VMD_EMPTY
  153. or BOOST_VMD_IDENTITY is the choice.
  154. </p>
  155. <p>
  156. Now for our two examples we can have:
  157. </p>
  158. <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">preprocessor</span><span class="special">/</span><span class="identifier">control</span><span class="special">/</span><span class="identifier">iif</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  159. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">vmd</span><span class="special">/</span><span class="identifier">empty</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  160. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">,</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="special">\</span>
  161. <span class="identifier">BOOST_PP_IIF</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">)</span> <span class="special">\</span>
  162. <span class="special">(</span> <span class="special">\</span>
  163. <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">,</span> <span class="special">\</span>
  164. <span class="identifier">SOME_FIXED_VALUE</span> <span class="identifier">BOOST_VMD_EMPTY</span> <span class="special">\</span>
  165. <span class="special">)</span> <span class="special">\</span>
  166. <span class="special">(</span><span class="identifier">parameter2</span><span class="special">)</span>
  167. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">(</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="identifier">some_processing_using_parameters</span>
  168. </pre>
  169. <p>
  170. or
  171. </p>
  172. <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">preprocessor</span><span class="special">/</span><span class="identifier">control</span><span class="special">/</span><span class="identifier">iif</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  173. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">vmd</span><span class="special">/</span><span class="identifier">identity</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  174. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">,</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="special">\</span>
  175. <span class="identifier">BOOST_PP_IIF</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">)</span> <span class="special">\</span>
  176. <span class="special">(</span> <span class="special">\</span>
  177. <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">,</span> <span class="special">\</span>
  178. <span class="identifier">BOOST_VMD_IDENTITY</span><span class="special">(</span><span class="identifier">SOME_FIXED_VALUE</span><span class="special">)</span> <span class="special">\</span>
  179. <span class="special">)</span> <span class="special">\</span>
  180. <span class="special">(</span><span class="identifier">parameter2</span><span class="special">)</span>
  181. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">(</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="identifier">some_processing_using_parameters</span>
  182. </pre>
  183. <p>
  184. and our macros will compile without preprocessing errors and work as expected.
  185. Both BOOST_VMD_EMPTY and BOOST_VMD_IDENTITY will take any number of parameters
  186. in their invocation, which makes them useful for a final invocation no matter
  187. what is being passed.
  188. </p>
  189. <h5>
  190. <a name="variadic_macro_data.vmd_useful.vmd_identity.h2"></a>
  191. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_identity.usage_for_boost_vmd_empty_and_bo"></a></span><a class="link" href="vmd_identity.html#variadic_macro_data.vmd_useful.vmd_identity.usage_for_boost_vmd_empty_and_bo">Usage
  192. for BOOST_VMD_EMPTY and BOOST_VMD_IDENTITY</a>
  193. </h5>
  194. <p>
  195. To use the BOOST_VMD_EMPTY macro either include the general header:
  196. </p>
  197. <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">vmd</span><span class="special">/</span><span class="identifier">vmd</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  198. </pre>
  199. <p>
  200. or include the specific header:
  201. </p>
  202. <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">vmd</span><span class="special">/</span><span class="identifier">empty</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  203. </pre>
  204. <p>
  205. To use the BOOST_VMD_IDENTITY macro either include the general header:
  206. </p>
  207. <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">vmd</span><span class="special">/</span><span class="identifier">vmd</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  208. </pre>
  209. <p>
  210. or include the specific header:
  211. </p>
  212. <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">vmd</span><span class="special">/</span><span class="identifier">identity</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  213. </pre>
  214. <h5>
  215. <a name="variadic_macro_data.vmd_useful.vmd_identity.h3"></a>
  216. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_identity.using_boost_vmd_empty_and_boost0"></a></span><a class="link" href="vmd_identity.html#variadic_macro_data.vmd_useful.vmd_identity.using_boost_vmd_empty_and_boost0">Using
  217. BOOST_VMD_EMPTY and BOOST_VMD_IDENTITY with VC++</a>
  218. </h5>
  219. <p>
  220. Unfortunately the Visual C++ preprocessor has a problem when a macro expands
  221. to something followed by a variadic macro which expands to nothing. This
  222. is the case when using BOOST_VMD_EMPTY following some non-empty expansion,
  223. or the equivalent use of BOOST_VMD_IDENTITY. As strange as it sounds this
  224. VC++ preprocessor problem is normally solved by concatenating the result
  225. using BOOST_PP_CAT with an empty value. But then again the many non-standard
  226. behaviors of VC++ are difficult to understand or even track.
  227. </p>
  228. <p>
  229. In order to make this technique transparent when used with a C++ standard
  230. conforming preprocessor or VC++ non-standard preprocessor you can use the
  231. BOOST_VMD_IDENTITY_RESULT macro passing to it a single parameter which is
  232. a result returned from a macro which uses BOOST_VMD_IDENTITY ( or its equivalent
  233. 'value BOOST_VMD_EMPTY' usage ).
  234. </p>
  235. <p>
  236. Given our MACRO_CHOICE example above, if you have another macro invoking
  237. MACRO_CHOICE simply enclose that invocation within BOOST_VMD_IDENTITY_RESULT.
  238. As in the very simple:
  239. </p>
  240. <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">vmd</span><span class="special">/</span><span class="identifier">identity</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  241. <span class="preprocessor">#define</span> <span class="identifier">CALLING_MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">,</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="special">\</span>
  242. <span class="identifier">BOOST_VMD_IDENTITY_RESULT</span><span class="special">(</span><span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">,</span><span class="identifier">parameter2</span><span class="special">))</span>
  243. </pre>
  244. <p>
  245. Alternatively you can change MACRO_CHOICE so that its implementation and
  246. usage is:
  247. </p>
  248. <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">preprocessor</span><span class="special">/</span><span class="identifier">control</span><span class="special">/</span><span class="identifier">iif</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  249. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">vmd</span><span class="special">/</span><span class="identifier">identity</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  250. <span class="preprocessor">#define</span> <span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">,</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="special">\</span>
  251. <span class="identifier">BOOST_VMD_IDENTITY_RESULT</span> <span class="special">\</span>
  252. <span class="special">(</span> <span class="special">\</span>
  253. <span class="identifier">BOOST_PP_IIF</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">)</span> <span class="special">\</span>
  254. <span class="special">(</span> <span class="special">\</span>
  255. <span class="identifier">MACRO_CALL_IF_PARAMETER_1</span><span class="special">,</span> <span class="special">\</span>
  256. <span class="identifier">BOOST_VMD_IDENTITY</span><span class="special">(</span><span class="identifier">SOME_FIXED_VALUE</span><span class="special">)</span> <span class="special">\</span>
  257. <span class="special">)</span> <span class="special">\</span>
  258. <span class="special">(</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="special">\</span>
  259. <span class="special">)</span>
  260. <span class="preprocessor">#define</span> <span class="identifier">CALLING_MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">,</span><span class="identifier">parameter2</span><span class="special">)</span> <span class="special">\</span>
  261. <span class="identifier">MACRO_CHOICE</span><span class="special">(</span><span class="identifier">parameter1</span><span class="special">,</span><span class="identifier">parameter2</span><span class="special">)</span>
  262. </pre>
  263. <p>
  264. Using BOOST_VMD_EMPTY and BOOST_VMD_IDENTITY in this way will ensure they
  265. can be used without preprocessing problems with either VC++ or any C++ standard
  266. conforming preprocessor.
  267. </p>
  268. <h5>
  269. <a name="variadic_macro_data.vmd_useful.vmd_identity.h4"></a>
  270. <span class="phrase"><a name="variadic_macro_data.vmd_useful.vmd_identity.usage_for_boost_vmd_identity_res"></a></span><a class="link" href="vmd_identity.html#variadic_macro_data.vmd_useful.vmd_identity.usage_for_boost_vmd_identity_res">Usage
  271. for BOOST_VMD_IDENTITY_RESULT</a>
  272. </h5>
  273. <p>
  274. The macro BOOST_VMD_IDENTITY_RESULT is in the same header file as BOOST_VMD_IDENTITY,
  275. so to use the BOOST_VMD_IDENTITY_RESULT macro either include the general
  276. header:
  277. </p>
  278. <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">vmd</span><span class="special">/</span><span class="identifier">vmd</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  279. </pre>
  280. <p>
  281. or include the specific header:
  282. </p>
  283. <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">vmd</span><span class="special">/</span><span class="identifier">identity</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  284. </pre>
  285. </div>
  286. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  287. <td align="left"></td>
  288. <td align="right"><div class="copyright-footer">Copyright &#169; 2010-2017 Tropic Software
  289. East Inc</div></td>
  290. </tr></table>
  291. <hr>
  292. <div class="spirit-nav">
  293. <a accesskey="p" href="../vmd_useful.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../vmd_useful.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="vmd_empty_ppdata.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  294. </div>
  295. </body>
  296. </html>