mirror of
https://github.com/boostorg/preprocessor.git
synced 2025-07-28 19:27:13 +02:00
125 lines
5.9 KiB
HTML
125 lines
5.9 KiB
HTML
![]() |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|||
|
<html>
|
|||
|
<head>
|
|||
|
<meta http-equiv="content-type" content="text/html;
|
|||
|
charset=windows-1252">
|
|||
|
<title>BOOST_PP_VA_OPT</title>
|
|||
|
<link rel="stylesheet" type="text/css" href="../styles.css">
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
<div style="margin-left: 0px;"> The <b>BOOST_PP_VA_OPT</b> variadic
|
|||
|
macro is a more flexible alternative to the C++20 __VA_OPT__
|
|||
|
construct. It expands to either one of two inputs depending on
|
|||
|
whether the variadic data is empty or not, whereas the C++20
|
|||
|
__VA_OPT__ constructs expands to either its input or nothing
|
|||
|
depending on whether the variadic data is empty or not. This macro
|
|||
|
only exists when the compilation is at the C++20 level and the
|
|||
|
__VA_OPT__ construct is supported.</div>
|
|||
|
<h4>Usage</h4>
|
|||
|
<div class="code"> <b>BOOST_PP_VA_OPT</b>(x,y,<i>...</i>) <a
|
|||
|
href="../topics/variadic_macros.html#VNotation" target="_self"><sup>(v)</sup></a><br>
|
|||
|
</div>
|
|||
|
<h4>Arguments</h4>
|
|||
|
<p> x<br>
|
|||
|
A tuple
|
|||
|
whose data is the macro expansion if the <i>variadic data</i> is
|
|||
|
<b>not</b> empty<br>
|
|||
|
y<br>
|
|||
|
A tuple
|
|||
|
whose data is the macro expansion if the <i>variadic data</i> is
|
|||
|
empty<br>
|
|||
|
,,,<br>
|
|||
|
The <i>variadic
|
|||
|
data</i> to be checked for emptiness<br>
|
|||
|
</p>
|
|||
|
<dl>
|
|||
|
</dl>
|
|||
|
<h4>Remarks</h4>
|
|||
|
<div> When the macro invocation BOOST_PP_VARIADIC_HAS_OPT() expands
|
|||
|
to 1, then this macro exists and can be invoked, otherwise this
|
|||
|
macro does not exist and attempting to invoke it will lead to a
|
|||
|
preprocessor error that the macro can not be found. Because of
|
|||
|
this condition the header file for including this macro includes
|
|||
|
the header file for the BOOST_PP_VARIADIC_HAS_OPT macro.<br>
|
|||
|
<br>
|
|||
|
The difference between this macro and the __VA_OPT__ construct
|
|||
|
illustrates a limitation of the latter construct with a trade off
|
|||
|
of simpler syntax. The differences between the __VA_OPT__
|
|||
|
construct and this macro are:<br>
|
|||
|
<ul>
|
|||
|
<li>The __VA_OPT__ construct offers a choice as its expansion
|
|||
|
only between its input preprocessing tokens or nothing (
|
|||
|
called a "single placemarker token" ) depending on whether the
|
|||
|
implicit variadic data is empty or not. There is no way using
|
|||
|
the __VA_OPT__ construct to specify any alternative but the
|
|||
|
"single placemarker token" when the variadic data is empty
|
|||
|
whereas any preprocessing tokens can be specified when the
|
|||
|
variadic data is not empty. With the BOOST_PP_VA_OPT macro the
|
|||
|
user can specify as its expansion preprocessing tokens both
|
|||
|
when the variadic data is empty and when the variadic data is
|
|||
|
not empty.</li>
|
|||
|
<li>The __VA_OPT__ construct offers a simple syntax whereas this
|
|||
|
macro is more verbose. The BOOST_PP_VA_OPT macro's first and
|
|||
|
second parameters must be Boost PP tuples of data, in order to
|
|||
|
expand to normal or variadic data, and the third parameter
|
|||
|
must be the variadic data to check for emptiness, whereas the
|
|||
|
__VA_OPT__ construct has an implied variadic data as
|
|||
|
__VA_ARGS__ to check for emptiness and can specify its
|
|||
|
expansion directly in terms of its input.</li>
|
|||
|
<li>The __VA_OPT__ construct can only be specified in the
|
|||
|
replacement list of some macro, whereas the BOOST_PP_VA_OPT
|
|||
|
macro can be used both as an alternative to the __VA_OPT__
|
|||
|
construct in the replacement list of some macro and anywhere
|
|||
|
else a macro can be used.</li>
|
|||
|
<li>It is impossible to have a left parenthesis '(' or a right
|
|||
|
parenthesis ')' as preprocessing token data within the
|
|||
|
__VA_OPT__ construct whereas both are possible as part of the
|
|||
|
expanded data for the BOOST_PP_VA_OPT macro.<br>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<br>
|
|||
|
The exact BOOST_PP_VA_OPT equivalent to the construct of
|
|||
|
'__VA_OPT__ ( pp-tokens )' in the replacement list of a macro is
|
|||
|
'BOOST_PP_VA_OPT (( pp-tokens ),(),__VA_ARGS__)'.</div>
|
|||
|
<h4>See Also</h4>
|
|||
|
<ul>
|
|||
|
<li><a href="variadic_has_opt.html">BOOST_PP_VARIADIC_HAS_OPT</a></li>
|
|||
|
</ul>
|
|||
|
<h4>Requirements</h4>
|
|||
|
<div> <b>Header:</b> <a
|
|||
|
href="../headers/facilities/va_opt.html"><boost/preprocessor/facilities/va_opt.hpp></a>
|
|||
|
</div>
|
|||
|
<h4>Sample Code</h4>
|
|||
|
<div>
|
|||
|
<pre>#include <<a href="../headers/facilities/va_opt.html">boost/preprocessor/facilities/va_opt.hpp</a>>
|
|||
|
|
|||
|
# if <a href="variadic_has_opt.html">BOOST_PP_VARIADIC_HAS_OPT</a>()
|
|||
|
|
|||
|
#define DATA
|
|||
|
#define OBJECT OBJECT2
|
|||
|
#define OBJECT2
|
|||
|
#define FUNC(x) FUNC2(x)
|
|||
|
#define FUNC2(x)
|
|||
|
#define FUNC_GEN(x,y) (1,2,3)
|
|||
|
|
|||
|
<a href="va_opt.html">BOOST_PP_VA_OPT</a>((1),(2),DATA) // expands to 2
|
|||
|
<a href="va_opt.html">BOOST_PP_VA_OPT</a>((3),(4),OBJECT) // expands to 4
|
|||
|
<a href="va_opt.html">BOOST_PP_VA_OPT</a>((5),(6),FUNC(1)) // expands to 6
|
|||
|
<a href="va_opt.html">BOOST_PP_VA_OPT</a>((7,8),(9,10),FUNC) // expands to 7,8
|
|||
|
<a href="va_opt.html">BOOST_PP_VA_OPT</a>((1,2,3,4,5),(6,7,8,9,10),FUNC_GEN) // expands to 1,2,3,4,5
|
|||
|
|
|||
|
#endif
|
|||
|
</pre>
|
|||
|
</div>
|
|||
|
<hr size="1">
|
|||
|
<div style="margin-left: 0px;"> <i><EFBFBD> Copyright Edward Diener 2019</i>
|
|||
|
</div>
|
|||
|
<div style="margin-left: 0px;">
|
|||
|
<p><small>Distributed under the Boost Software License, Version
|
|||
|
1.0. (See accompanying file <a
|
|||
|
href="../../../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or
|
|||
|
copy at <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>)</small></p>
|
|||
|
</div>
|
|||
|
</body>
|
|||
|
</html>
|