|
Boost : |
From: Edward Diener (eldiener_at_[hidden])
Date: 2019-10-10 09:17:37
The C++20 preprocessor construct __VA_OPT__ has the additional affect of
providing the ability to write a general purpose macro for testing
emptiness, ie. no preprocessor tokens, in C++ macro programming that is
100% reliable for any preprocessor data passed to it. Previously such a
macro testing for emptiness always had some corner cases where the test
might fail with a preprocessor error, but in C++20 mode at least the
test can now be completely reliable in all cases.
So I have added two macros along with documentation, as well as a topic
discussing emptiness, to the Boost PP library. The first macro is called
BOOST_PP_VARIADIC_OPT, invoked with no parameters as
BOOST_PP_VARIADIC_OPT(), which expands to 1 if the compiler is in C++20
mode, supports variadic macros, and supports the C++ 20 __VA_OPT__
construct, and otherwise expands to 0. The second macro, which only
exists if BOOST_PP_VARIADIC_OPT() expands to 1, is called
BOOST_PP_CHECK_EMPTY. This second macro is a variadic macro which
takes a single parameter of variadic data, and expands to 1 if the data
is empty or expands to being empty, while otherwise expanding to 0 if
the data is not empty.
Furthermore in the Boost VMD library I have updated the
BOOST_VMD_IS_EMPTY macro to essentially invoke the BOOST_PP_CHECK_EMPTY
macro when BOOST_PP_VARIADIC_OPT() expands to 1, while retaining the
current processing when that is not the case. As well I have updated the
VMD discussion of emptiness in the documentation of Boost VMD to include
information about the ability to provide a 100% reliable test for
emptiness in C++20.
Neither change in Boost PP or Boost VMD should affect any end-user or
Boost library in any way. There are tests for all these changes and all
tests have passed. I will update the release notes for Boost PP and
Boost VMD for the next release of Boost with this information.
As always any comments, questions, or criticism of these changes are
always welcome.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk