가능한 모든 변수 함수 또는 함수 템플릿을 사용해야한다고 동의하지만 매크로를 사용하여 수행 할 수있는 작업과 수행 할 수없는 작업에 대한 오해를 보여주기 때문에이 답변에서 함수를 가장 할 것입니다. 옵션이 아닙니다.
예. FOO(5, "4gamma");
및 FOO(5, "4");
그래서 함수 호출이 보일 것이다. 첫 번째 경우
__VA_ARGS__
은
4, "gamma"
입니다. 두 번째 경우
__VA_ARGS__
은
4
입니다.
전처리 기에서 , "gamma"
을 추출해야하는 경우 전처리 기가이를 수행 할 수 있습니다. 그것은 매개 변수의 양에 상한이 필요합니다,하지만 당신은 당신이 좋아하는 어떤 숫자로 이것을 증가시킬 수 있습니다. 그래도 추한 데. __VA_ARGS__
더 쉼표를 포함하지
경우, 추출은 간단하다 : 당신이 __VA_ARGS__
이 적어도 하나의 쉼표가 알고 있다면
#define COMMA_TRAILING_ARGS_0(a)
, 당신은
#define COMMA_TRAILING_ARGS_1(a, ...) , __VA_ARGS__
을 사용할 수 있습니다 그리고 당신은 감지 할 수있는 다음의 어느에 매크로 인수의 특정 상한까지 사용 :
#define ARG16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, ...) _16
#define HAS_COMMA(...) ARG16(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,)
결합 :
#define COMMA_TRAILING_ARGS_0(a)
#define COMMA_TRAILING_ARGS_1(a, ...) , __VA_ARGS__
#define ARG16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, ...) _16
#define HAS_COMMA(...) ARG16(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,)
#define CONCAT(a, b) a ## b
#define CONCAT_(a, b) CONCAT(a, b)
#define FOO(a, ...) BAR(a CONCAT_(COMMA_TRAILING_ARGS_, HAS_COMMA(__VA_ARGS__)) (__VA_ARGS__))
FOO(5, 4, x, q); // expands to BAR(5, x, q);
FOO(5, 4, "gamma"); // expands to BAR(5, "gamma");
FOO(5, 4); // expands to BAR(5);
왜 매크로를 사용하고 있습니까? 당신이 해결하려고하는 실제 문제는 무엇입니까? –
variadic 함수 템플릿이 솔루션입니다. – DeiDei
@DeiDei 기능 템플릿을 자세히 설명해 주시겠습니까? – FigsHigs