सी में, अक्सर वैरिएडिक टेम्प्लेट तर्कों के माध्यम से पुनरावृत्त करना और एक विशिष्ट ऑपरेशन करना वांछनीय होता है, जैसे कॉलिंग एक समारोह. इसे या तो उपयोग करके प्राप्त किया जा सकता है:
(f(args), ...);
हालाँकि, यदि कॉल किया गया फ़ंक्शन संभावित रूप से एक ऑब्जेक्ट लौटाता है अतिभारित अल्पविराम ऑपरेटर के साथ, आपको इसका उपयोग करना चाहिए:
((void)f(args), ...);
एक सामान्य दृष्टिकोण सूची-आरंभीकरण का लाभ उठाना और उसके भीतर विस्तार करना है:
{ print(Args)... }
चूंकि प्रिंट() शून्य लौटाता है , आप int:
{ (print(Args), 0)... }
यह सुनिश्चित करने के लिए कि यह किसी भी संख्या के साथ काम करता है, समस्या का समाधान कर सकते हैं तर्कों से, आप पैक को हमेशा कम से कम एक तत्व बना सकते हैं:
{ 0, (print(Args), 0)... }
आप इस पैटर्न को पुन: प्रयोज्य में समाहित कर सकते हैं मैक्रो:
namespace so { using expand_type = int[]; } #define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }
अतिभारित अल्पविराम ऑपरेटरों को संभालने के लिए, आप मैक्रो को संशोधित कर सकते हैं:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) \ ::so::expand_type{ 0, ((PATTERN), void(), 0)... }
यदि आप अनावश्यक मेमोरी आवंटन के बारे में चिंतित हैं, तो आप एक कस्टम प्रकार परिभाषित कर सकते हैं जो सूची का समर्थन करता है- आरंभीकरण लेकिन डेटा संग्रहीत नहीं करता:
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3