VMD has the ability to retrieve the type of any data which it can parse, which means any VMD sequence. The generic macro to do this is called BOOST_VMD_GET_TYPE and it takes a single required variadic parameter, which is a VMD sequence. Since a VMD sequence is any data which VMD can parse the BOOST_VMD_GET_TYPE macro works with any VMD data.
It returns one of the types previously discussed when introducing v-types as an identifier subset. As explained previously in that topic a v-type is fully recognized by VMD macros and can be part of a sequence and passed as VMD data just like all the other data types VMD recognizes.
When BOOST_VMD_GET_TYPE returns the type of data it returns by default the most specific type that the data can be. This means that non-empty lists and arrays are returned as such, not as tuples, and numbers and types and empty lists are returned as such, not as identifiers.
#include <boost/vmd/get_type.hpp> #define BOOST_VMD_REGISTER_ANID (ANID) #define SEQUENCE_EMPTY #define SEQUENCE_MULTI (1,2,3) 88 #define SEQUENCE1 (3,(1,2,3)) #define SEQUENCE2 ANID #define SEQUENCE3 (1,(2,(3,BOOST_PP_NIL))) #define SEQUENCE4 1 #define SEQUENCE5 (1)(2)(3) #define SEQUENCE6 (1,2,3) #define SEQUENCE7 BOOST_VMD_TYPE_NUMBER BOOST_VMD_GET_TYPE(SEQUENCE_EMPTY) will return BOOST_VMD_TYPE_EMPTY BOOST_VMD_GET_TYPE(SEQUENCE_MULTI) will return BOOST_VMD_TYPE_SEQUENCE BOOST_VMD_GET_TYPE(SEQUENCE1) will return BOOST_VMD_TYPE_ARRAY BOOST_VMD_GET_TYPE(SEQUENCE2) will return BOOST_VMD_TYPE_IDENTIFIER BOOST_VMD_GET_TYPE(SEQUENCE3) will return BOOST_VMD_TYPE_LIST BOOST_VMD_GET_TYPE(SEQUENCE4) will return BOOST_VMD_TYPE_NUMBER BOOST_VMD_GET_TYPE(SEQUENCE5) will return BOOST_VMD_TYPE_SEQ BOOST_VMD_GET_TYPE(SEQUENCE6) will return BOOST_VMD_TYPE_TUPLE BOOST_VMD_GET_TYPE(SEQUENCE7) will return BOOST_VMD_TYPE_TYPE
You can use the general header file:
or you can use the individual header file:
for the BOOST_VMD_GET_TYPE macro.