"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > C++ में सभी वैरिएडिक टेम्प्लेट तर्कों पर एक फ़ंक्शन कैसे शुरू करें?

C++ में सभी वैरिएडिक टेम्प्लेट तर्कों पर एक फ़ंक्शन कैसे शुरू करें?

2024-11-19 को प्रकाशित
ब्राउज़ करें:886

How to Invoke a Function on All Variadic Template Arguments in C  ?

सी वैरिएडिक टेम्प्लेट: सभी टेम्प्लेट तर्कों पर एक फ़ंक्शन को लागू करना

सी में, अक्सर वैरिएडिक टेम्प्लेट तर्कों के माध्यम से पुनरावृत्त करना और एक विशिष्ट ऑपरेशन करना वांछनीय होता है, जैसे कॉलिंग एक समारोह. इसे या तो उपयोग करके प्राप्त किया जा सकता है:

C 17 फोल्ड एक्सप्रेशन

(f(args), ...);

हालाँकि, यदि कॉल किया गया फ़ंक्शन संभावित रूप से एक ऑब्जेक्ट लौटाता है अतिभारित अल्पविराम ऑपरेटर के साथ, आपको इसका उपयोग करना चाहिए:

((void)f(args), ...);

Pre-C 17 समाधान

एक सामान्य दृष्टिकोण सूची-आरंभीकरण का लाभ उठाना और उसके भीतर विस्तार करना है:

{ 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