प्रॉम्ट और दायरा
एक जेनेरिक लाइब्रेरी को C++26 पैक इंडेक्सिंग का उपयोग करके टाइप पैक या फ़ंक्शन आर्ग्युमेंट पैक से एक निश्चित स्थिति वाले तत्व को पढ़ना चाहिए, जबकि पुराने टूलचेन अभी भी बिल्ड होते रहें। एक्सप्रेशन-पैक इंडेक्सिंग, टाइप-पैक इंडेक्सिंग, इंडेक्स कंस्ट्रेंट्स, फीचर डिटेक्शन और कम्पैटिबिलिटी कार्यान्वयन की व्याख्या करें।
यह भाषा के नियमों और इंजीनियरिंग फ़ॉलबैक्स का परीक्षण करता है; यह दावा न करें कि हर कम्पाइलर संस्करण पहले से ही इस सुविधा को लागू करता है।
इंटरव्यूअर क्या परीक्षण कर रहा है
- क्या आप एक्सप्रेशन-पैक इंडेक्सिंग को टाइप पैक्स के लिए पैक-इंडेक्सिंग विनिर्देशक (specifier) से अलग पहचानते हैं।
- क्या आप जानते हैं कि इंडेक्स एक कम्पाइल-टाइम कॉन्सटेंट होना चाहिए और पैक के आकार से अधिक नहीं हो सकता।
- क्या आप कम्पाइलर नाम से अनुमान लगाने के बजाय क्षमता पहचान के लिए
__cpp_pack_indexingका उपयोग करते हैं। - क्या रिकर्सिव या
tupleफ़ॉलबैक API अनुबंध को सुरक्षित रखता है।
स्पष्टीकरण के लिए प्रश्न
- क्या आप वैल्यू पैक, टाइप पैक, या टेम्प्लेट-पैरामीटर पैक को इंडेक्स कर रहे हैं?
- क्या इंडेक्स एक कम्पाइल-टाइम कॉन्सटेंट है या रनटाइम पूर्णांक (integer)?
- कौन से कम्पाइलर, भाषा मोड और CI संस्करण समर्थित हैं?
- क्या आउट-ऑफ-रेंज इंडेक्स को किसी कंस्ट्रेंट में विफल होना चाहिए, या कॉलर्स द्वारा जाँचा जाना चाहिए?
- क्या फ़ॉलबैक को व्यवहार के साथ-साथ डायग्नोस्टिक्स और जटिलता को भी बनाए रखना चाहिए?
30-सेकंड का उत्तर
"C++26 पैक इंडेक्सिंग एक कॉन्सटेंट इंडेक्स के साथ एक्सप्रेशन-पैक तत्व का चयन करता है; एक टाइप पैक पैक-इंडेक्सिंग विनिर्देशक का उपयोग करता है। इंडेक्स एक कम्पाइल-टाइम कॉन्सटेंट होना चाहिए और सीमा से बाहर नहीं हो सकता। रनटाइम पूर्णांक के लिए अभी भी एक ऐरे, टपल, या डिस्पैच टेबल की आवश्यकता होती है। मैं __cpp_pack_indexing का पता लगाऊँगा, उपलब्ध होने पर सीधे सिंटैक्स का उपयोग करूँगा, पुराने कम्पाइलरों पर रिकर्शन या टपल ऑपरेशन्स का उपयोग करूँगा, और समान सीमाओं व API व्यवहार का परीक्षण करूँगा।"
चरण-दर-चरण डिज़ाइन
1. दोनों रूपों को अलग करें
एक्सप्रेशन-पैक इंडेक्सिंग फ़ंक्शन आर्ग्युमेंट्स से एक वैल्यू का चयन करता है; टाइप-पैक इंडेक्सिंग टेम्प्लेट पैरामीटर्स से एक टाइप का चयन करता है। दोनों पोजीशनल चयन को टेम्प्लेट इंस्टैंसिएशन में ले जाते हैं और हाथ से लिखे गए रिकर्शन को कम करते हैं, लेकिन उनका सिंटैक्स और बाद का उपयोग भिन्न होता है।
2. कम्पाइल-टाइम मूल्यांकन की आवश्यकता
इंडेक्स नॉन-टाइप टेम्प्लेट पैरामीटर संदर्भ में एक कॉन्सटेंट एक्सप्रेशन है। रनटाइम पूर्णांक इसे प्रतिस्थापित नहीं कर सकता। यदि रनटाइम चयन की आवश्यकता है, तो पैक को एक टपल, ऐरे, या फ़ंक्शन टेबल के रूप में साकार (materialize) करें और रनटाइम पर डिस्पैच करें।
template <std::size_t I, class... Ts>
using type_at = Ts...[I];
template <std::size_t I, class... Ts>
constexpr decltype(auto) value_at(Ts&&... values) {
return values...[I];
}3. खाली और आउट-ऑफ-रेंज पैक्स को संभालें
एक खाली पैक में कोई इंडेक्स करने योग्य तत्व नहीं होता है, और पैक आकार के बराबर या उससे ऊपर का इंडेक्स अमान्य होता है। एक सार्वजनिक टेम्प्लेट को इसे requires कंस्ट्रेंट के साथ जल्दी अस्वीकार कर देना चाहिए जो इंडेक्स को पैक आकार से कम रखता है। परीक्षणों में खाली, पहले, अंतिम और आउट-ऑफ-रेंज कॉल्स को शामिल किया जाना चाहिए।
4. फीचर डिटेक्शन का उपयोग करें
cppreference फीचर-टेस्ट मैक्रो __cpp_pack_indexing को मान 202311L के साथ रिकॉर्ड करता है। भाषा मोड के साथ मैक्रो की जाँच करें, और आवश्यकता पड़ने पर कम्पाइलर CI का उपयोग करें; केवल कम्पाइलर संस्करण स्ट्रिंग भाषा क्षमता का अनुबंध नहीं है।
5. पुराने-टूलचेन फ़ॉलबैक को डिज़ाइन करें
C++26 के बिना, एक टाइप पैक रिकर्सिव टेम्प्लेट्स या टपल टाइप-सिलेक्शन यूटिलिटी का उपयोग कर सकता है; एक वैल्यू पैक पहले एक टपल बना सकता है और पोजीशनल एक्सेस यूटिलिटी को कॉल कर सकता है। समान बाउंड्स कंस्ट्रेंट को बनाए रखें और CI में दोनों पाथ कम्पाइल करें।
6. API और डायग्नोस्टिक्स का मूल्यांकन करें
डायरेक्ट पैक इंडेक्सिंग कार्यान्वयन को छोटा करता है, लेकिन इसे एक स्थिर API के पीछे रहना चाहिए। आवश्यक मानक मोड का दस्तावेजीकरण करें, सुनिश्चित करें कि डायग्नोस्टिक्स इंडेक्स और पैक आकार का नाम दें, और केवल सोर्स कोड की पंक्तियों की तुलना करने के बजाय दोनों पाथ के लिए कम्पाइल समय और जेनरेट किए गए कोड का बेंचमार्क करें।
मॉडल उच्च-गुणवत्ता वाला उत्तर
"मैं पहले इंडेक्स की गई इकाई की पहचान करूँगा। C++26 एक्सप्रेशन-पैक इंडेक्सिंग एक वैल्यू का चयन करता है, जबकि टाइप पैक पैक-इंडेक्सिंग विनिर्देशक का उपयोग करता है; इंडेक्स एक कम्पाइल-टाइम कॉन्सटेंट है, इसलिए खाली और आउट-ऑफ-रेंज पैक्स को कंस्ट्रेंट सीमा पर विफल होना चाहिए। __cpp_pack_indexing का पता लगाएँ; सक्षम टूलचेन पर सीधे सिंटैक्स का उपयोग करें और पुराने टूलचेन पर उसी API के पीछे रिकर्शन, tuple_element, और get का उपयोग करें। एक रनटाइम इंडेक्स के लिए टपल या डिस्पैच टेबल की आवश्यकता होती है। परीक्षण खाली, सीमा, आउट-ऑफ-रेंज, दोनों भाषा मोड और दोनों कार्यान्वयनों को कवर करते हैं।"
सामान्य गलतियाँ
- टेम्प्लेट इंडेक्स के रूप में रनटाइम पूर्णांक का उपयोग करना → भाषा को एक कॉन्सटेंट की आवश्यकता होती है → टपल, ऐरे, या डिस्पैच टेबल का उपयोग करें।
- केवल
__cplusplusकी जाँच करना → फीचर समर्थन कार्यान्वयन की स्थिति पर निर्भर करता है →__cpp_pack_indexingऔर CI की जाँच करें। - सीमाओं को अंतर्निहित छोड़ना → त्रुटियाँ इंस्टैंसिएशन में गहराई में दिखाई देती हैं → इंटरफ़ेस को जल्दी बाधित (constrain) करें।
- केवल टाइप पैक्स को लागू करना → वैल्यू-पैक कॉल्स को अभी भी रिकर्शन की आवश्यकता होती है → दोनों रूपों का अलग-अलग परीक्षण करें।
- फ़ॉलबैक में सेमेंटिक्स बदलना → टूलचेन अलग-अलग व्यवहार करते हैं → कंस्ट्रेंट्स, परीक्षण और स्थिर API साझा करें।
फॉलो-अप प्रश्न और उत्तर
क्या पैक इंडेक्सिंग रनटाइम इंडेक्सिंग को हल कर सकता है?
नहीं। इसके लिए एक कम्पाइल-टाइम कॉन्सटेंट की आवश्यकता होती है। रनटाइम चयन के लिए एक टपल, ऐरे, फ़ंक्शन टेबल, या अन्य रनटाइम डिस्पैच संरचना की आवश्यकता होती है।
requires कंस्ट्रेंट क्यों जोड़ें?
भाषा अंततः एक आउट-ऑफ-रेंज इंडेक्स को अस्वीकार कर देगी, लेकिन एक स्पष्ट कंस्ट्रेंट पहले और स्पष्ट इंटरफ़ेस डायग्नोस्टिक्स देता है और फ़ॉलबैक को समान अनुबंध प्रदर्शित करने की अनुमति देता है।
क्या रिकर्सिव फ़ॉलबैक हमेशा धीमा होता है?
नहीं। रनटाइम कोड समान परिणाम के लिए अनुकूलित (optimize) हो सकता है, जबकि टेम्प्लेट की गहराई, कम्पाइल समय और डायग्नोस्टिक्स भिन्न हो सकते हैं। सिंटैक्स की लंबाई से निर्णय लेने के बजाय सपोर्ट मैट्रिक्स और बेंचमार्क के साथ सत्यापित करें।