C++17 क्या लाया? मानक की मुख्य नवीनताओं का विश्लेषण
\n\nयदि आप C++ में लिखते हैं और मुख्यधारा में बने रहना चाहते हैं, तो C++17 वह संस्करण है जिसे अभी सीखना चाहिए। यह 2017 में आया था, लेकिन आज भी कई प्रोजेक्ट C++14 या C++11 पर अटके हुए हैं, नए मानक पर जाने से डरते हैं। और यह गलत है।
\n\nइस लेख में हम वास्तविक उदाहरणों के साथ C++17 की नई क्षमताओं का विश्लेषण करेंगे। आप सीखेंगे कि कोड को कैसे सरल बनाएं, अनावश्यक जाँचों से कैसे छुटकारा पाएं और प्रोग्राम को तेज़ कैसे बनाएं। हम सभी 105 बदलावों की सूची नहीं देंगे - केवल वही जो वास्तव में काम आएगा।
\n\n1. स्ट्रक्चर्ड बाइंडिंग्स (Structured Bindings) — एक सेकंड में डीकंपोज़िशन
\n\nC++17 की सबसे सुविधाजनक विशेषताओं में से एक स्ट्रक्चर्ड बाइंडिंग्स है। पहले, टपल या पेयर को तोड़ने के लिए std::tie लिखना या इंडेक्स से एक्सेस करना पड़ता था। अब सब कुछ अधिक सुरुचिपूर्ण है।
उदाहरण: फ़ंक्शन से कई मान लौटाना
\n\n#include <iostream>\n#include <tuple>\n#include <string>\n\nstd::tuple<int, std::string, double> getData() {\n return {42, "उत्तर", 3.14};\n}\n\nint main() {\n // C++17: std::tie के बजाय एक पंक्ति\n auto [id, name, value] = getData();\n std::cout << name << ": " << id << " (" << value << ")\\n";\n return 0;\n}\n\nक्या बदला? पहले वेरिएबल्स को अलग से घोषित करना होता था, फिर std::tie कॉल करना होता था। अब auto [a, b, c] आपके लिए सारा काम करता है।
स्ट्रक्चर्ड बाइंडिंग्स न केवल टपल के साथ, बल्कि ऐरे और किसी भी ऐसी स्ट्रक्चर के साथ काम करती हैं जिनमें पब्लिक फील्ड हों। यह C++17 के नवाचारों में से एक है जो कोड को साफ और पढ़ने में आसान बनाता है।
\n\n2. std::optional — "जादुई" मानों से छुटकारा
\n\nआपने कितनी बार ऐसा कोड देखा है जहाँ फ़ंक्शन त्रुटि दर्शाने के लिए -1 या nullptr लौटाता है? या इससे भी बुरा — bool-फ़्लैग और रिफरेंस द्वारा परिणाम? std::optional<T> इस समस्या को हमेशा के लिए हल करता है।
उदाहरण: कंटेनर में सुरक्षित खोज
\n\n#include <iostream>\n#include <optional>\n#include <map>\n#include <string>\n\nstd::optional<int> findValue(const std::map<std::string, int>& m, const std::string& key) {\n auto it = m.find(key);\n if (it != m.end()) {\n return it->second; // मान मौजूद है\n }\n return std::nullopt; // मान मौजूद नहीं है\n}\n\nint main() {\n std::map<std::string, int> ages = {{"एलिस", 30}, {"बॉब", 25}};\n \n auto result = findValue(ages, "चार्ली");\n if (result) {\n std::cout << "मिला: " << *result << "\\n";\n } else {\n std::cout << "कुंजी नहीं मिली\\n";\n }\n \n // या डिफ़ॉल्ट मान के लिए value_or का उपयोग करें\n int age = result.value_or(0);\n return 0;\n}\n\nstd::optional एक कंटेनर है जो मान रख सकता है या खाली हो सकता है। आप इसे if (opt) के माध्यम से जाँचते हैं, और मान *opt या opt.value() के माध्यम से प्राप्त करते हैं। यह "समझौता" त्रुटि कोड से कहीं अधिक सुरक्षित है।
3. if constexpr — बिना सिरदर्द के टेम्पलेट
\n\nC++17 की नई क्षमताएँ मेटाप्रोग्रामिंग के लिए एक वरदान हैं। if constexpr SFINAE-एक्रोबैटिक्स के बिना टेम्पलेट्स के अंदर सशर्त कंपाइलेशन की अनुमति देता है।
उदाहरण: विभिन्न प्रकारों के लिए सार्वभौमिक फ़ंक्शन
\n\n#include <iostream>\n#include <type_traits>\n#include <string>\n\ntemplate <typename T>\nvoid printInfo(const T& value) {\n if constexpr (std::is_integral_v<T>) {\n std::cout << "पूर्णांक: " << value << "\\n";\n } else if constexpr (std::is_floating_point_v<T>) {\n std::cout << "फ़्लोटिंग पॉइंट संख्या: