std :: संरचित बाइंडिंग के साथ अनदेखा?


87

प्रस्तावना:

std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();

C ++ 1z संरचित बाइंडिंग के लिए वाक्यविन्यास पेश करेगा, जिसके बजाय लिखना संभव होगा

int a, b, c;
std::tie(a, b, c) = f();

कुछ इस तरह

auto [a, b, c] = f();

हालाँकि, कुछ घटकों को अनदेखा std::tieकरने की भी अनुमति है std::ignore, जैसे:

std::tie(a, b, std::ignore, c) = g();

क्या नए संरचित बाइंडिंग सिंटैक्स का उपयोग करके कुछ समान करना संभव होगा? यह कैसे काम करेगा?


2
बस वहाँ एक मनमाना नाम रख दिया।
एन। 'सर्वनाम' मी।

1
@nm एक मनमाना नाम एक प्रति नहीं बनाएगा?
पायोत्र स्कोटनिकी

1
@Prrr से अधिक प्रतियां नहीं हैं std::ignore, मुझे लगता है। चूंकि हमने कॉपी एलिसेंस की गारंटी दी है, डमी वैरिएबल को इनिशियलाइज़ किया गया है; के साथ std::tie, अस्थायी जो असाइनमेंट के आरएचएस पर std::ignoreहै, आरंभिक है।
j6t 11

1
एक मैक्रो होना संभव होगा auto[IGNORE]जो एक अद्वितीय नाम (उदाहरण: संकलक-विशिष्ट कॉर्नर या लाइन के साथ ) उत्पन्न करता है । यह पठनीय पर्याप्त होगा, और व्यवहार में की तरह कार्य करेगा std::ignoreके लिए std::tie
14

2
@PiotrSkotnicki नहीं, केवल एक विघटन घोषणा की प्रतिलिपि बनाता है वह चीज़ है जो विघटित हो रही है। घोषित की जा रही चीजें या तो उस चीज़ के सदस्यों / तत्वों के लिए उपनाम हैं या संदर्भ जो getरिटर्न देता है।
TC

जवाबों:


62

संरचित बाइंडिंग प्रस्ताव में आपके प्रश्न का उत्तर देने वाला एक समर्पित खंड ( P0144R2 ) होता है:

3.8 क्या घटकों को स्पष्ट रूप से अनदेखा करने का एक तरीका होना चाहिए?

प्रेरणा अप्रयुक्त नामों के बारे में संकलक को चेतावनी देने के लिए होगी। हमें लगता है कि उत्तर "अभी तक नहीं" होना चाहिए। यह उपयोग के मामलों से प्रेरित नहीं है (संकलक चेतावनी चेतावनी एक प्रेरणा है, लेकिन यह प्रति से अधिक उपयोग का मामला नहीं है), और सबसे अच्छा तब तक छोड़ दिया जाता है जब तक कि हम एक अधिक सामान्य पैटर्न मिलान प्रस्ताव के संदर्भ में इसे फिर से जारी नहीं कर सकते हैं जहां इसे गिरना चाहिए। एक विशेष मामले के रूप में।

समरूपता के साथ std::tieकुछ का उपयोग करने का सुझाव देंगे std::ignore:

tuple<T1,T2,T3> f();

auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element

हालांकि, यह अजीब लगता है।

भाषा में पैटर्न मिलान की आशंका की तरह एक वाइल्डकार्ड का सुझाव सकता है _या *, लेकिन जब से हम अभी तक पैटर्न मिलान की जरूरत नहीं है यह एक वाक्य रचना है कि हम संगत हो जाएगा पता लेने के लिए समय से पहले है। यह एक शुद्ध विस्तार है जो पैटर्न मिलान के साथ विचार करने के लिए इंतजार कर सकता है।

हालाँकि, ध्यान दें कि वर्तमान में मानक के कार्य मसौदे को संबंधित राष्ट्रीय निकाय (एनबी) द्वारा संशोधित किया जा रहा है, और इस सुविधा ( P0488R0 , US100) का अनुरोध करने वाली एक एनबी टिप्पणी है :

विघटन घोषणाओं को कुछ लौटाए गए मूल्यों को त्यागने के लिए सिंटैक्स प्रदान करना चाहिए, जैसे कि std::tieउपयोग करता है std::ignore


6
अब बहुत देर हो चुकी है, लेकिन मैं यह बताना चाहूँगा कि एक ऐसी सुविधा जिसका उपयोग करने में अजीब लगता है और शायद इसे भविष्य में बदल दिया जाएगा , यह सुविधा का उपयोग करने की क्षमता नहीं होने से बेहतर है , और यह ऐसा नहीं लगता ऐसी बात जो मानकों समिति को एक टाइम मशीन की कामना करेगी क्योंकि std::ignoreसंरचित बाइंडिंग में कोई अन्य उचित व्याख्या नहीं है ।
डैनियल एच

11

क्या नए संरचित बाइंडिंग सिंटैक्स का उपयोग करके कुछ समान करना संभव होगा?

नहीं, आपको केवल एक चर नाम बनाना होगा जिसका उल्लेख बाद में नहीं किया जाएगा।


25
जो अप्रयुक्त चर चेतावनी उत्पन्न करेगा -Wunused-variable, आप उपयोग कर सकते हैं: [[maybe_unused]] auto [ a, b, dummy ] = std::tuple(1,"2",3f);लेकिन इसका मतलब है कि उनमें से कोई भी अप्रयुक्त हो सकता है, आपको पता नहीं होगा कि कौन सा है। अभी उस मामले का कोई अच्छा समाधान नहीं है। उम्मीद है कि यह c ++ 20 में सुधार किया जाएगा। यहाँ से लिया गया: stackoverflow.com/questions/41404001/…
serine

3
"अभी उस मामले के लिए कोई अच्छा समाधान नहीं है" : यह पूरी तरह से सच नहीं है: आप(void)dummy; अन्य चर को प्रभावित किए बिना अप्रयुक्त चर चेतावनी से छुटकारा पाने के लिए उपयोग कर सकते हैं।
और्री

16
@andreee: केवल एक चेतावनी को शांत करने के लिए एक बयान का उपयोग करना वह नहीं है जिसे मैं "अच्छा समाधान" कहूंगा।
निकोल बोल

"केवल एक चेतावनी को शांत करने के लिए एक बयान का उपयोग करना ..." क्या हम बयानों से बाहर चल रहे हैं?
एंडीजोस्ट

2
@AndyJost: नहीं, लेकिन हम स्क्रीन पर दृश्य स्थान की मात्रा से बाहर चल रहे हैं। एक चेतावनी को शांत करने पर इसे विशेष रूप से कीमती ऊर्ध्वाधर स्थान खर्च करना उपयोगी नहीं है।
निकोल बोलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.