Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟีเจอร์ใหม่ของ C++17


คณะกรรมการมาตรฐาน 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 {
      ..........
}; }