एक पैक्ड वेरिएडिक टेम्प्लेट तर्क सूची पर पुनरावृति कैसे करें
सी में, एक पैक्ड वेरिएडिक टेम्प्लेट तर्क सूची पर पुनरावृत्त करना एक चुनौती बन जाता है तर्कों की संख्या जानने और उनसे व्यक्तिगत रूप से डेटा पुनर्प्राप्त करने में असमर्थता। फ़ंक्शन के निर्माण में मैक्रो के उपयोग से यह समस्या और भी जटिल हो गई है, जो पुनरावर्ती कॉल को रोकता है।
इसे संबोधित करने के लिए, प्रदान किया गया समाधान एक कस्टम प्रकार, कोई भी नियोजित करता है, जो विभिन्न प्रकार के डेटा को धारण कर सकता है। इस प्रकार को एक विविध टेम्पलेट में पास करके, तर्कों को किसी भी ऑब्जेक्ट के वेक्टर में विस्तारित किया जाता है। इसके बाद, इस वेक्टर के अलग-अलग तत्वों को विशेष गेटर फ़ंक्शंस (get
हालांकि यह विधि कार्य पूरा करती है, लेकिन इसकी आवश्यकता होती है वर्बोज़ फ़ंक्शन कॉल, जैसे foo(arg(1000)). इसे सरल बनाने के लिए, हम पैक किए गए विविध टेम्पलेट तर्क सूचियों के लिए अधिक संक्षिप्त पुनरावृत्ति विधि या std::get() के समकक्ष की तलाश करते हैं।
एसटीएल फोल्ड एक्सप्रेशन और लैम्ब्डा का उपयोग करके समाधान
सी 17 और बाद के संस्करण के लिए, पुनरावृत्ति प्राप्त करने के लिए फोल्ड एक्सप्रेशन का उपयोग लैम्ब्डा फ़ंक्शन के साथ किया जा सकता है। लैम्ब्डा लूप के भीतर मनमाना संचालन कर सकता है, जिसमें एक काउंटर बढ़ाना और वर्तमान तर्क को प्रिंट करना शामिल है:
template
void Foo (Ts && ... inputs)
{
int i = 0;
([&]
{
// Do things in your "loop" lambda
i;
std::cout << "input " << i << " = " << inputs << std::endl;
} (), ...);
}
यह विधि अधिक संक्षिप्त और सुपाठ्य पुनरावृत्ति तंत्र प्रदान करती है।
लूप ब्रेक से निपटने के लिए विकल्प
हालांकि उपरोक्त समाधान कार्य पूरा करता है, इसमें लूप के भीतर ब्रेक या रिटर्न लागू करने की क्षमता का अभाव है। इसे संबोधित करने के लिए, हम वर्कअराउंड का उपयोग कर सकते हैं जैसे:
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3