VMD имеет возможность извлекать тип любых данных, которые он может анализировать, что означает любую последовательность VMD. Макрос для этого называется BOOST_VMD_GET_TYPE и он принимает один необходимый параметр, который является последовательностью VMD.
Он возвращает один из типов, ранее обсуждавшихся при введении v-типов в качестве подмножества идентификатора. Как объяснялось ранее в этой теме, v-тип полностью распознается макросами VMD и может быть частью последовательности и передаваться в виде данных VMD, как и все другие типы данных, распознаваемые VMD.
Когда BOOST_VMD_GET_TYPE возвращает тип данных, он по умолчанию возвращает наиболее конкретный тип данных. Это означает, что непустые списки и массивы возвращаются как таковые, а не как кортежи, а номера и типы и пустые списки возвращаются как таковые, а не как идентификаторы.
#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
Вы можете использовать общий файл заголовка:
#include <boost/vmd/vmd.hpp>
вы можете использовать индивидуальный файл заголовка:
#include <boost/vmd/get_type.hpp>
для макроса BOOST_VMD_GET_TYPE.