사실 부분적으로이 문제를 해결할 수 있습니다.
__VA_ARGS__
과 C++ 11의 가변 템플릿 모두를 직접 자유롭게 추출 할 수 있습니다. 그러나 당신은 첫 번째 요소를 가질 수 있습니다. 예를 들어 OUT(...)
이라는 매크로가 있고 std :: cout을 생성한다고 가정 해 봅시다. C : < < A < B < < C ... 여기서 A, B, C는 매크로의 가변 인수입니다. 이것을 시도하십시오 :
#include <iostream>
#define SEPERATOR <<
#define GET_1_OF(element1, ...) element1
#define GET_2_OF(element1, ...) element1 SEPERATOR GET_1_OF(__VA_ARGS__)
#define GET_3_OF(element1, ...) element1 SEPERATOR GET_2_OF(__VA_ARGS__)
#define BAR(...) GET_3_OF(__VA_ARGS__)
int main()
{
std::cout << BAR(1,2,3,4,5);
return 0;
}
물론 이것은 해결책이 아닙니다. 그러나 원하는 것을하기 위해 GET_N_OF의 숫자를 늘릴 수 있습니다. SEPERATOR
은 <<
이므로 MACRO는 1 << 2 << 3
등으로 쓸 수 있습니다.
이제이 코드에 문제가 있습니다. BAR(1,2,3,4,5)
을 BAR(1)
으로 변경하십시오. 오류가 발생하는 것을 확인할 수 있습니다. 이것은 우리가 여분의 SEPERATOR
을 가지고 있기 때문에 더 많은 논쟁 (variadic이기 때문에)이 문제가 아니지만 3 개의 인자를 기대했기 때문입니다.(당신이 인수의 수를 알고 있기 때문에) 그래서이 문제를 해결하기 위해 대신 BAR(...)
사용 GET_N_OF(...)
사용에 :
#include <iostream>
#define SEPERATOR <<
#define GET_1_OF(element1, ...) element1
#define GET_2_OF(element1, ...) element1 SEPERATOR GET_1_OF(__VA_ARGS__)
#define GET_3_OF(element1, ...) element1 SEPERATOR GET_2_OF(__VA_ARGS__)
#define GET_4_OF(element1, ...) element1 SEPERATOR GET_3_OF(__VA_ARGS__)
#define GET_5_OF(element1, ...) element1 SEPERATOR GET_4_OF(__VA_ARGS__)
int main()
{
std::cout << GET_5_OF(1,2,3,4,5);
std::cout << GET_1_OF(1);
return 0;
}
는 당신이 전혀 매크로를 사용하지 않는을 무엇을하고 있는지 모르는 경우주의하시기 바랍니다 ! 내 답변은 당신에게 유익 할 MACRO 코드를 공유하는 것이 었습니다. 나는 그들이 대단히 필요할 때까지 MACRO의 사용을 항상 꺼린다.
미래에는 질문의 미리보기를보기 위해 5 초 정도 걸리면 형식이 완전히 엉망이되었음을 깨달은 다음 정리를 시도하면 사람이 쉽게 찾을 수 있습니다. 대답. :) SO * *는 코드 형식 지정 기능을 제공합니다. 코드를 선택하고 버튼을 눌러야합니다. – jalf
'C++ 11'을 사용할 수 있습니까? – StoryTeller
대신 variadic 템플릿을 사용하십시오 ... –