4

MACRO (something)가 MACRO (something, else)와 다르게 확장되도록 일종의 "Overloading"매크로를 수행하려고합니다. 내가 here에서 가져온 코드 조각 (내가 100 % 휴대용입니다 있는지 확실하지 않습니다)과 부스트 PP 라이브러리에서 일부 기능을 사용C 전 처리기, 매크로 "오버로드"

, 나는 그것이 작동되도록 할 수 있었다 : D

//THESE TWO COUNT THE NUMBER OF ARGUMENTS 
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N 
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1) 

//THIS ONE RETURNS THE PARAMETER AT POSITION _i FROM A LIST OF __VA_ARGS__ 
#define VA_ARG(_i, ...) BOOST_PP_ARRAY_ELEM(_i, (VA_NARGS(__VA_ARGS__), (__VA_ARGS__))) 

//AND THIS ONE IS THE 'OVERLOADED' MACRO ;) 
#define TEST(...) BOOST_PP_IF(BOOST_PP_EQUAL(1, VA_NARGS(__VA_ARGS__)), function_A(VA_ARG(0, __VA_ARGS__)), \ //1 parameter 
        BOOST_PP_IF(BOOST_PP_EQUAL(2, VA_NARGS(__VA_ARGS__)), function_B(VA_ARG(0, __VA_ARGS__) + VA_ARG(1, __VA_ARGS__)), \ //2 parameters 
        BOOST_PP_IF(BOOST_PP_EQUAL(3, VA_NARGS(__VA_ARGS__)), function_C(VA_ARG(1, __VA_ARGS__) + VA_ARG(2, __VA_ARGS__)), BOOST_PP_EMPTY())) // 3 parameters and so on ... 

So  TEST(a) = function_A(a) 
     TEST(a, b) = function_B(a + b) 
    TEST(a, b, c) = function_C(b + c) 

지금은 여전히 내가하고 싶은 두 가지 누락 해요 :

  1. 나는 매크로의 수를 차지 때 기록 될 수 있다고 생각 (나는 그것을 해결하지 않을 경우 정말 상관 없어이 일) '변종'과 그 특파원 '출력'은 위와 비슷한 코드를 생성합니다. 위의 예제를 생성하려면 TEMPLATE (3, function_A (...), function_B (...), function_C (...))와 같은 것.

  2. TEST()가 인수없이 호출되면 어떻게됩니까? VA_NARGS는 1로 확장되지만 첫 번째 인수는 ""(아무것도 아님)입니다. 나는 __VA_ARGS__에서 '0'인수를 감지하거나 'null'인수와 실제 인수를 구별하여이 상황에 반응하는 '오버로드'기능을 확장하는 방법을 찾으려고합니다. 어떤 아이디어?

+0

가능한 경우 투표하기 질문! :) – almosnow

+2

부스트 -> C++ -> 이미 C++을 사용하고 있다면 프리 프로세서를 사용하지 말고 일반 함수 (원하는 경우 인라인 됨)를 사용하십시오. C 전 처리기는 사람들이 그것을 남용하지 않도록 의도적으로 멍청하다. – Dummy00001

+0

C 또는 C++ 용입니까? 또한 매크로에 varargs를 사용하는 것은 이식성이 없다는 점에 유의하십시오. –

답변

4

먼저 2 번 질문에 대답하십시오. 그렇습니다. 가변 매크로를 사용하면 빈 인수 목록을 검색 할 수도 있습니다. 설명은 조금 길어서, 나는 here이라고 썼다. 이 방법을 사용중인 부스트 매크로와 결합하는 것이 상대적으로 쉽습니다.

질문 1의 경우에도 가능합니다. Boost에는 이와 비슷한 몇 가지 반복기 매크로가 있지만 내 생각에는 약간 무서워 보인다. 내가 올바르게 이해한다면 중첩리스트 (a, (b, (c,d)))과 같은 것을 사용하면 편리하지 않습니다.

는 (나는이 더 직접적으로 을 달성하지만 불행히도 패키지가 아직 출시 준비가되지 않았습니다 수 매크로 세트를 썼다. 당신이 정말로 그것을 관심 을 경우 개인 날에 문의.)

편집 :P99 꾸러미는 뜻밖의 시간에 게시되고 매크로 "오버로딩"및 유형 제네릭 매크로보다 많은 내용을 포함합니다.

+1

부스트 반복자 매크로는 몇 가지 다른 유형이 있습니다. 시퀀스 :리스트'(a (b (c, d))', 튜플'(a, b, c)'(길이를 알아야 함) 그리고'(a) (b) (c)'를 나열합니다. 후자가 내가 처리하기에 가장 쉽습니다. – KitsuneYMG

+0

옌스, 바위, 그 완벽 :). 고마워요! – almosnow