• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">&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
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">&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>
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">&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>
91<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>
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">&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>
125<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>
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">&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>
141<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>
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">&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>
169<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>
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">&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>
185<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>
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">&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>
212</pre>
213<p>
214        or include the specific header:
215      </p>
216<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>
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">&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>
222</pre>
223<p>
224        or include the specific header:
225      </p>
226<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>
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">&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>
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">&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>
264<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>
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">&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>
296</pre>
297<p>
298        or include the specific header:
299      </p>
300<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>
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