[/ 
  (C) Copyright Edward Diener 2011-2015,2020
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

[section:vmd_identifying Identifying macros and BOOST_VMD_IS_EMPTY]

The various macros for identifying VMD data types complement
the ability to identify emptiness using BOOST_VMD_IS_EMPTY.
The general name I will use in this documentation for these 
specific macros is "identifying macros." The identifying macros
also share with BOOST_VMD_IS_EMPTY the inherent flaw
mentioned when discussing BOOST_VMD_IS_EMPTY prior to the C++20
standard, since they themselves use BOOST_VMD_IS_EMPTY to determine
that the input has ended.

To recapitulate the flaw with BOOST_VMD_IS_EMPTY prior to C++20:

* using a standard C++ compiler if the input ends with the
name of a function-like macro, and that macro takes two or
more parameters, a preprocessing error will occur.
* using the VC++ compiler with its default preprocessor if the input consists of the name
of a function-like macro, and that macro when invoked with no 
parameters returns a tuple, the macro erroneously returns 1, 
meaning that the input is empty.
* even if the function-like macro takes one parameter, passing
emptiness to that macro could cause a preprocessing error.

The obvious way to avoid the BOOST_VMD_IS_EMPTY problem with the 
identifying macros is to design input so that the name of a function-like
macro is never passed as a parameter. This can be done, if one uses
VMD and has situations where the input could contain
a function-like macro name, by having that function-like macro name placed
within a Boost PP data type, such as a tuple, without attempting to identify
the type of the tuple element using VMD. In other word if the input is:

 ( SOME_FUNCTION_MACRO_NAME )
 
and we have the macro definition:

 #define SOME_FUNCTION_MACRO_NAME(x,y) some_output
 
VMD can still parse the input as a tuple, if desired, using BOOST_VMD_IS_TUPLE
without encountering the BOOST_VMD_IS_EMPTY problem. However if the input is:

 SOME_FUNCTION_MACRO_NAME
 
either directly or through accessing the above tuple's first element, and the 
programmer attempts to use BOOST_VMD_IS_IDENTIFIER with this input, the 
BOOST_VMD_IS_EMPTY problem will occur.

[endsect]
