뭔가 당신이 그것을 향상시킬 수 있습니다 있지만, 다음과 같은 작업을해야합니다 : 연타 트렁크에
#include <boost/preprocessor.hpp>
#define VA_OPT_SUPPORTED_II_1(_) 0
#define VA_OPT_SUPPORTED_II_2(_1, _2) 1
#define VA_OPT_SUPPORTED_I(...) BOOST_PP_OVERLOAD(VA_OPT_SUPPORTED_II_, __VA_OPT__(,))(__VA_OPT__(,))
#define VA_OPT_SUPPORTED VA_OPT_SUPPORTED_I(?)
,이 C++ (17) 모드에서 C++ 2A 모드 0에서 1로 평가합니다. GCC 트렁크는 실제로 이것을 C++ 17에서 1로 평가하지만 그 모드에서는 __VA_OPT__
도 처리합니다. 이것은 무엇을
인수의 수에 따라 _II
의 _1
또는 _2
버전 중 하나를 호출하는 사용 BOOST_PP_OVERLOAD
입니다. __VA_OPT__(,)
이 ,
으로 확장되면 2 개의 빈 인수가 있습니다. 그렇지 않은 경우 빈 인수가 1 개 있습니다. 항상이 매크로를 인수 목록으로 부르기 때문에 __VA_OPT__
을 지원하는 컴파일러는 항상 ,
으로 확장해야합니다.
당연히 Boost.PP 의존성은 필수 사항이 아닙니다. 간단한 1-or-2-arg OVERLOAD
매크로는 쉽게 교체 할 수 있어야합니다. 일반성을 조금 잃는 것이 더 간단 만들려면 :
#define OVERLOAD2_I(_1, _2, NAME, ...) NAME
#define OVERLOAD2(NAME1, NAME2, ...) OVERLOAD2_I(__VA_ARGS__, NAME2, NAME1)
#define VA_OPT_SUPPORTED_I(...) OVERLOAD2(VA_OPT_SUPPORTED_II_1, VA_OPT_SUPPORTED_II_2, __VA_OPT__(,))(__VA_OPT__(,))
연타에서 경고 한 휴대있다 :
경고 : 가변 인자 매크로는 C++ 98 [-WC++ 98 -와 호환되지 않는 compat-pedantic]
C++ 11 가변 매크로 지원없이이 탐지가 가능할 지 모르겠습니다. __cplusplus
값이 C++ 11보다 낮다고 가정 할 수도 있지만 Clang은 이러한 검사를 래핑해도 경고를 표시합니다.
이것은 내가 광산을 개선 할 수 있다고 말했을 때 상상했던 간결함의 종류입니다. 멋진 일 :) – chris
NICE. 고맙습니다. –