सी ++ मानक समिति हमेशा हर तीन साल में नई सुविधाओं को शिपिंग करने पर ध्यान केंद्रित कर रही है। विनिर्देश के दो मुख्य भाग प्रोग्रामिंग भाषा और मानक टेम्पलेट लाइब्रेरी (एसटीएल) की मुख्य कार्यक्षमता हैं। कोड को क्लीनर, आसान और कॉम्पैक्ट बनाने के लिए नई सुविधाएँ पेश की गई हैं। पेश की गई सुविधाओं की सूची निम्नलिखित है-:
<एच2>1. फ़ोल्ड एक्सप्रेशनफोल्ड एक्सप्रेशन का उपयोग तर्कों की एक चर संख्या के लिए छोटे कोड लिखने के लिए किया जाता है जिसे किसी फ़ंक्शन में पास किया जा सकता है या फ़ंक्शन से वापस किया जा सकता है। यह तर्क के रूप में और फ़ंक्शन के रिटर्न स्टेटमेंट में किसी भी संख्या में चर के उपयोग को सक्षम बनाता है।
वाक्यविन्यास:-
-
यूनरी राइट फोल्ड - (पैक op1 ...)
-
यूनरी लेफ्ट फोल्ड - (… op1 pack )
-
बाइनरी लेफ्ट फोल्ड - (init op1 … op1 pack )
-
बाइनरी राइट फोल्ड - (पैक op1 … op1 init )
यहां पैक करें एक पैरामीटर पैक है जिसे किसी भी संख्या में चर के लिए विस्तारित किया जा सकता है। 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 का नाम बन जाता है। तत्वों की संख्या पहचानकर्ताओं की संख्या के बराबर होनी चाहिए।
इंट ऐरी [3] ={ 3,4,5 };
ऑटो [a,b,c] =arry;
// यहां सरणी बनाई गई है और ए 3 को संदर्भित करता है, बी 4 को संदर्भित करता है और सी 5 को संदर्भित करता है।
-
केस 2:- टपल जैसे टाइप को बाइंड करना
फ्लोट fnum{};
चार ch1{};
इंट नंबर{};
std::tuple
tplex(fnum, std::move(ch1) , number); कॉन्स्ट ऑटो और [पी, क्यू, आर] =tplex;
// p fnum का जिक्र करते हुए स्ट्रक्चर्ड बाइंडिंग का नाम है
// q संरचित बाइंडिंग का नाम है जो ch1 को संदर्भित करता है
// r स्ट्रक्चर्ड बाइंडिंग का नाम है जो संख्या को संदर्भित करता है
-
मामला 3:- डेटा सदस्यों के लिए बाध्यकारी
स्ट्रक्चर स्ट्रक्चरवर {
परिवर्तनीय इंट num1 :2;
वोलेटाइल डबल num2;
};
स्ट्रक्चरवर फंक ();
कॉन्स्ट ऑटो [ए, बी] =func ();
// a 2-बिट बिट फ़ील्ड के लिए एक int lvalue है
// b एक स्थिरांक अस्थिर डबल अंतराल है
3. प्रत्यक्ष सूची का उपयोग करके एनम का प्रारंभ
C++17 के साथ एनमों को अब ब्रेसिज़ का उपयोग करके प्रारंभ किया जा सकता है।
वाक्यविन्यास:-
enum byte : unsigned char {}; byte b0 {0}; // OK byte b1 = byte{1}; // OK byte b2 = byte{256}; // ERROR - 0 to 255 only
4. अगर और स्विच के अंदर परिवर्तनीय घोषणा
सी ++ 17 अगर और स्विच स्थितियों के अंदर चर की घोषणा की अनुमति देता है। इससे समान नाम वाले वेरिएबल का उपयोग करना आसान हो जाता है जिनके अलग-अलग स्कोप होते हैं।
वाक्यविन्यास:-
if (data type variable condition) { //statements } switch ( condition; variable ) { //statements }
5. अगर constexpr स्टेटमेंट
टेम्पलेट कोड के लिए उपयोगी सुविधा। if constexpr कथन का संकलन समय पर मूल्यांकन किया जाता है।
यह कैसा है
नीचे दी गई तुलनाओं का उपयोग करके मददगार दिखाया जा सकता है:-
सामान्य यदि-अन्य विवरण:-
int var = 10; if (var >= 10) { var=var+10; } else { var=var-10; }
Constexpr if-else कथन:-
template <typename T> auto length ( T const& value ) { //checking if T is integer or not if (is_integral<T>::value) { return value; } else { return value.length(); } }
6. नेस्टेड नेमस्पेस
नेमस्पेस का उपयोग समान कोड जैसे वर्गों और कार्यों को एक साथ समूहित करने के लिए किया जाता है जो सहसंबद्ध होते हैं। सी ++ 17 नेस्टेड नेमस्पेस का उपयोग करने के अधिक आसान सिंटैक्स की अनुमति देता है। पहले नेस्टेड नेमस्पेस की संख्या अधिक होने पर सिंटैक्स काफी गड़बड़ था। ब्रेसिज़ को संभालना अब आवश्यक नहीं है।
C++17 से पहले:-
namespace Earth{ namespace Continent { namespace Country { class City { .......... }; } } }
नया सिंटैक्स:-
namespace Earth :: Continent :: Country { class City { .......... }; }