कुछ तरह के बाद, काम करना चाहिए, हालांकि आप इसे सुधारने के लिए सक्षम हो सकता है:
#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(?)
बजना ट्रंक पर, यह सी ++ 2 ए मोड और 0 सी ++ 17 मोड में में 1 करने के लिए मूल्यांकन करता है। जीसीसी ट्रंक वास्तव में सी ++ 17 में 1 का मूल्यांकन करता है, लेकिन उस मोड में __VA_OPT__
को भी संभालता है।
यह क्या करता है उपयोग BOOST_PP_OVERLOAD
_II
के दोनों _1
या _2
संस्करण तर्क की संख्या के आधार कॉल करने के लिए है। यदि __VA_OPT__(,)
,
तक फैला है, तो 2 खाली तर्क होंगे। यदि नहीं, तो 1 खाली तर्क होगा। हम हमेशा इस मैक्रो को एक तर्क सूची के साथ कहते हैं, इसलिए __VA_OPT__
का समर्थन करने वाला कोई भी कंपाइलर हमेशा इसे ,
पर विस्तारित करना चाहिए।
स्वाभाविक रूप से, Boost.PP निर्भरता अनिवार्य नहीं है। एक साधारण 1-या-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__(,))
वहाँ एक पोर्टेबिलिटी बजना से चेतावनी है:
चेतावनी: variadic मैक्रो के सी ++ 98 [-WC++ 98 असंगत हैं compat-pedantic]
मुझे नहीं पता कि यह पहचान सी ++ 11 वैरिएडिक मैक्रो समर्थन के बिना भी संभव है या नहीं। आप C12+ 11 से कम __cplusplus
मानों के लिए कोई समर्थन नहीं मान सकते हैं, लेकिन क्लैंग अभी भी इस तरह की जांच में लपेटने पर भी चेतावनी देता है।
यह वह प्रकार है जिसकी मैं कल्पना कर रहा था जब मैंने कहा कि मेरा शायद सुधार किया जा सकता है। अच्छा काम :) – chris
नाइस। धन्यवाद। –