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