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)
지금은 여전히 내가하고 싶은 두 가지 누락 해요 :
나는 매크로의 수를 차지 때 기록 될 수 있다고 생각 (나는 그것을 해결하지 않을 경우 정말 상관 없어이 일) '변종'과 그 특파원 '출력'은 위와 비슷한 코드를 생성합니다. 위의 예제를 생성하려면 TEMPLATE (3, function_A (...), function_B (...), function_C (...))와 같은 것.
TEST()가 인수없이 호출되면 어떻게됩니까? VA_NARGS는 1로 확장되지만 첫 번째 인수는 ""(아무것도 아님)입니다. 나는
__VA_ARGS__
에서 '0'인수를 감지하거나 'null'인수와 실제 인수를 구별하여이 상황에 반응하는 '오버로드'기능을 확장하는 방법을 찾으려고합니다. 어떤 아이디어?
가능한 경우 투표하기 질문! :) – almosnow
부스트 -> C++ -> 이미 C++을 사용하고 있다면 프리 프로세서를 사용하지 말고 일반 함수 (원하는 경우 인라인 됨)를 사용하십시오. C 전 처리기는 사람들이 그것을 남용하지 않도록 의도적으로 멍청하다. – Dummy00001
C 또는 C++ 용입니까? 또한 매크로에 varargs를 사용하는 것은 이식성이 없다는 점에 유의하십시오. –