คณะกรรมการมาตรฐาน C++ ให้ความสำคัญกับการจัดส่งคุณลักษณะใหม่ ๆ ทุก ๆ สามปีอยู่เสมอ สองส่วนหลักของข้อกำหนดคือฟังก์ชันหลักของภาษาการเขียนโปรแกรมและ Standard Template Library (STL) มีการแนะนำคุณสมบัติใหม่เพื่อทำให้โค้ดสะอาดขึ้น ง่ายขึ้นและกะทัดรัด ต่อไปนี้เป็นรายการคุณลักษณะที่แนะนำ-:
1. นิพจน์พับ
นิพจน์การพับใช้เพื่อเขียนโค้ดที่สั้นลงสำหรับจำนวนตัวแปรของอาร์กิวเมนต์ที่สามารถส่งผ่านไปยังฟังก์ชันหรือสามารถส่งคืนจากฟังก์ชันได้ ช่วยให้สามารถใช้ตัวแปรจำนวนเท่าใดก็ได้เป็นอาร์กิวเมนต์และในคำสั่งส่งคืนของฟังก์ชัน
ไวยากรณ์:-
-
Unary พับขวา - ( pack op1 ... )
-
พับซ้าย Unary - ( … op1 pack )
-
พับซ้ายไบนารี - ( init op1 … op1 pack )
-
พับขวาไบนารี - ( pack op1 … op1 init )
ที่นี่ แพ็ค เป็นชุดพารามิเตอร์ที่สามารถขยายได้สำหรับตัวแปรจำนวนเท่าใดก็ได้ op1 เป็นผู้ดำเนินการ ( -, + , <=,>=, <,> , ==, *, / …. ). ในการพับไบนารี op1 ทั้งคู่เป็นตัวดำเนินการเดียวกัน
เริ่มต้น เป็นนิพจน์ที่ไม่สามารถขยายได้
ตัวอย่าง
#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:- ผูก tuple เหมือนประเภท
float fnum{};
ถ่าน ch1{};
จำนวนเต็ม{};
std::tuple
tplex( fnum, std::move(ch1) , number); const auto&[ p, q, r] =tplex;
// p เป็นชื่อของการโยงแบบมีโครงสร้างที่อ้างอิงถึง fnum
// q เป็นชื่อของการโยงแบบมีโครงสร้างที่อ้างอิงถึง ch1
// r คือชื่อการโยงแบบมีโครงสร้างที่อ้างอิงถึงตัวเลข
-
กรณีที่ 3:- ผูกมัดกับสมาชิกข้อมูล
โครงสร้าง structVar {
int เปลี่ยนแปลงได้ num1 :2;
ระเหยดับเบิ้ล num2;
};
structVar func();
const อัตโนมัติ [ a, b] =func();
// a เป็นค่า int สำหรับฟิลด์ 2 บิต
// b เป็นค่าคงที่ของค่าคงที่สองเท่าของค่าคงที่
3. การเริ่มต้นของ enums โดยใช้รายการโดยตรง
ด้วย C++17 ตอนนี้ enums สามารถเริ่มต้นได้โดยใช้เครื่องหมายปีกกา
ไวยากรณ์:-
enum byte : unsigned char {}; byte b0 {0}; // OK byte b1 = byte{1}; // OK byte b2 = byte{256}; // ERROR - 0 to 255 only
4. การประกาศตัวแปรภายใน if และ Switch
C ++ 17 อนุญาตให้ประกาศตัวแปรภายในเงื่อนไข if และ switch ทำให้ง่ายต่อการใช้ตัวแปรที่มีชื่อเดียวกันซึ่งมีขอบเขตต่างกัน
ไวยากรณ์:-
if (data type variable condition) { //statements } switch ( condition; variable ) { //statements }
5. ถ้าคำสั่ง 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 ) { //checking if T is integer or not 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 { .......... }; }