2016-10-03 1 views
1

를 확인할 수는 전처리 형

FOO((TEST, (BAR,BAZ)), 
    (TEST2, 25, (BART, BAC) 
    ) 

두 번째 인수에서 두 번째 요소 인 반면, 두 번째 요소는 튜플 첫 번째 인수에 그것을 결정하는 방법은 없나요 번호?

1 인수, 2 요소 = (BAR, BAZ) 2 인수, 2 요소 = 내가 부스트 프리 프로세서를 사용하고 25

. 나는 작업을 표준화하는 것이 가장 쉽다는 것을 이해한다. 그러나 전 처리기가 형식을 결정하고 해당 정보를 유용한 방식으로 내게 반환 할 수 있는지 궁금합니다.

답변

1

부스트 1.60 이후로 Boost.VMD을 사용할 수 있습니다. 요소의 유형을 감지하는 여러 매크로가 있습니다 (BOOST_VMD_IS_TUPLE, BOOST_VMD_IS_SEQ, BOOST_VMD_IS_NUMBER, ...). 이 라이브러리에는 가변 매크로를 지원하는 최신 컴파일러가 필요합니다.

#include <iostream> 
#include <boost/preprocessor.hpp> 
#include <boost/vmd/is_tuple.hpp> 
#include <boost/vmd/is_number.hpp> 

#define IT_IS_A_TUPLE(TUPLE) BOOST_PP_STRINGIZE(TUPLE) " is a tuple" 
#define IT_IS_NOT_A_TUPLE(ARG) BOOST_PP_STRINGIZE(ARG) " is something else" 

#define IT_IS_A_NUMBER(NUMBER) BOOST_PP_STRINGIZE(NUMBER) " is a number" 
#define IT_IS_NOT_A_NUMBER(ARG) BOOST_PP_IIF(BOOST_VMD_IS_TUPLE(ARG),IT_IS_A_TUPLE,IT_IS_NOT_A_TUPLE)(ARG) 

#define DESCRIBE_ARGUMENT(ARG) BOOST_PP_IIF(BOOST_VMD_IS_NUMBER(ARG),IT_IS_A_NUMBER,IT_IS_NOT_A_NUMBER)(ARG) 
#define FOO(TUPLE) DESCRIBE_ARGUMENT(BOOST_PP_TUPLE_ELEM(1,TUPLE)) 

int main() 
{ 
    std::cout << FOO((TEST, (BAR,BAZ))) << std::endl; 
    std::cout << FOO((TEST2, 25, (BART, BAC))) << std::endl; 
} 

Another example BOOST_VMD_GET_TYPE 사용 :

#include <iostream> 
#include <boost/preprocessor.hpp> 
#include <boost/vmd/get_type.hpp> 


#define WHEN_ARG_IS_A_BOOST_VMD_TYPE_TUPLE(TUPLE) BOOST_PP_STRINGIZE(TUPLE) " is a tuple" 

#define WHEN_ARG_IS_A_BOOST_VMD_TYPE_NUMBER(NUMBER) BOOST_PP_STRINGIZE(NUMBER) " is a number" 

#define WHEN_ARG_IS_A_BOOST_VMD_TYPE_SEQ(SEQ) BOOST_PP_STRINGIZE(SEQ) " is a sequence" 

#define DESCRIBE_ARGUMENT(ARG) BOOST_PP_EXPAND(BOOST_PP_CAT(WHEN_ARG_IS_A_,BOOST_VMD_GET_TYPE(ARG))(ARG)) 
#define FOO(TUPLE) DESCRIBE_ARGUMENT(BOOST_PP_TUPLE_ELEM(1,TUPLE)) 

int main() 
{ 
    std::cout << FOO((TEST, (BAR,BAZ))) << std::endl; 
    std::cout << FOO((TEST2, 25, (BART, BAC))) << std::endl; 
    std::cout << FOO((TEST3,(BAR)(BAZ),(BAR,BAZ))) << std::endl; 
} 
Here는 통과 튜플의 두 번째 요소의 "타입"을 출력하는 예이다