C++ मानक समिति हर तीन साल में नई सुविधाएं जारी करने पर ध्यान केंद्रित करती है। विनिर्देश के दो मुख्य भाग प्रोग्रामिंग भाषा की मुख्य कार्यक्षमता और स्टैंडर्ड टेम्पलेट लाइब्रेरी (STL) हैं। नई सुविधाओं को कोड को क्लीनर, आसान और कॉम्पैक्ट बनाने के लिए पेश किया गया है। पेश की गई सुविधाओं की सूची निम्नलिखित है:
1. फोल्ड एक्सप्रेशन्स
फोल्ड एक्सप्रेशन्स का उपयोग किसी फंक्शन में पास किए जा सकने वाले या फंक्शन से लौटाए जा सकने वाले वेरिएबल संख्या में तर्कों के लिए छोटे कोड लिखने के लिए किया जाता है। यह किसी भी संख्या में वेरिएबल्स को फंक्शन के तर्कों और रिटर्न स्टेटमेंट्स में उपयोग करने में सक्षम बनाता है।
सिंटैक्स:
- यूनरी राइट फोल्ड - ( pack op1 ... )
- यूनरी लेफ्ट फोल्ड - ( ... op1 pack )
- बाइनरी लेफ्ट फोल्ड - ( init op1 ... op1 pack )
- बाइनरी राइट फोल्ड - ( pack op1 ... op1 init )
यहां pack एक पैरामीटर पैक है जिसे किसी भी संख्या में वेरिएबल्स के लिए विस्तारित किया जा सकता है। op1 एक ऑपरेटर है। ( -, +, <=, >=, <, >, ==, *, / ... )। बाइनरी फोल्ड में, दोनों op1 समान ऑपरेटर हैं।
init एक एक्सप्रेशन है जिसे विस्तारित नहीं किया जा सकता।
उदाहरण
#include <iostream>
#include <string>
using namespace std;
template<typename ...Args>
auto addition(Args ...args) {
return (args + ... + 0);
}
template<typename ...Args>
auto sum2(Args ...args) {
return (args + ...);
}
int main() {
cout << "Sum is: " << addition(1,1,1,1,1) << endl;
cout << "Sum 2 is: " << addition(1,2,3);
}
आउटपुट
Sum is: 5 Sum 2 is: 6
2. स्ट्रक्चर बाइंडिंग्स
इनका उपयोग कई वेरिएबल्स घोषित करने के लिए किया जाता है जिन्हें एक पेयर, टपल आदि में मानों से इनिशियलाइज़ किया जाता है। इन सभी वेरिएबल्स की इनिशियलाइज़र्स के साथ बाइंडिंग एक ही स्टेटमेंट में की जाती है।
केस 1: एक सरणी बाइंड करना
आइडेंटिफायर सूची में प्रत्येक आइडेंटिफायर सरणी के तत्व के लिए lvalue का नाम बन जाता है। तत्वों की संख्या आइडेंटिफायर्स की संख्या के बराबर होनी चाहिए।
int arry[3] = { 3, 4, 5 }; auto [a, b, c] = arry; // यहां सरणी बनाई गई है और a 3 को संदर्भित करता है, b 4 को और c 5 को।केस 2: टपल-जैसे प्रकार को बाइंड करना
float fnum{}; char ch1{}; int number{}; std::tuple < float&, char&&, int > tplex(fnum, std::move(ch1), number); const auto& [p, q, r] = tplex; // p fnum को संदर्भित करने वाले स्ट्रक्चर्ड बाइंडिंग का नाम है // q ch1 को संदर्भित करने वाले स्ट्रक्चर्ड बाइंडिंग का नाम है // r number को संदर्भित करने वाले स्ट्रक्चर्ड बाइंडिंग का नाम हैकेस 3: डेटा सदस्यों को बाइंड करना
struct structVar { mutable int num1 : 2; volatile double num2; }; structVar func(); const auto [a, b] = func(); // a 2-बिट बिट फील्ड के लिए एक int lvalue है // b एक const volatile double lvalue है
3. डायरेक्ट लिस्ट का उपयोग करके एनम्स का इनिशियलाइज़ेशन
C++17 के साथ एनम्स को अब ब्रेसेस का उपयोग करके इनिशियलाइज़ किया जा सकता है।
सिंटैक्स:
enum byte : unsigned char {};
byte b0 {0}; // OK
byte b1 = byte{1}; // OK
byte b2 = byte{256}; // ERROR - केवल 0 से 255
4. If और Switch के अंदर वेरिएबल घोषणा
C++17 if और switch शर्तों के अंदर वेरिएबल्स की घोषणा की अनुमति देता है। इससे उन वेरिएबल्स का उपयोग करना आसान हो जाता है जिनके नाम समान हैं लेकिन अलग-अलग स्कोप हैं।
सिंटैक्स:
if (data type variable condition) {
// statements
}
switch (condition; variable) {
// statements
}
5. If constexpr स्टेटमेंट
टेम्पलेट कोड के लिए उपयोगी सुविधा। if constexpr स्टेटमेंट का मूल्यांकन कंपाइल समय पर किया जाता है।
सामान्य If-else स्टेटमेंट्स:
int var = 10;
if (var >= 10) {
var = var + 10;
} else {
var = var - 10;
}
Constexpr If-else स्टेटमेंट्स:
template <typename T>
auto length(T const& value) {
// जांचें कि T पूर्णांक है या नहीं
if (is_integral<T>::value) {
return value;
} else {
return value.length();
}
}
6. नेस्टेड नेमस्पेसेस
नेमस्पेस का उपयोग समान कोड जैसे क्लासेस और फंक्शन्स को समूहित करने के लिए किया जाता है जो सहसंबद्ध हैं। C++17 नेस्टेड नेमस्पेसेस का उपयोग करने के लिए अधिक आसान सिंटैक्स की अनुमति देता है। पहले सिंटैक्स काफी गन्दा था जब नेस्टेड नेमस्पेसेस की संख्या अधिक थी। ब्रेसेस को संभालना अब आवश्यक नहीं है।
C++17 से पहले:
namespace Earth {
namespace Continent {
namespace Country {
class City {
..........;
};
}
}
}
नया सिंटैक्स:
namespace Earth::Continent::Country {
class City {
..........;
};
}