Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++17의 새로운 기능

<시간/>

C++ 표준 위원회는 항상 3년마다 새로운 기능을 제공하는 데 중점을 두고 있습니다. 사양의 두 가지 주요 부분은 프로그래밍 언어의 핵심 기능과 STL(표준 템플릿 라이브러리)입니다. 새로운 기능이 도입되어 코드를 더 깔끔하고 쉽고 간결하게 만들었습니다. 다음은 도입된 기능 목록입니다-:

1. 접기 표현식

접기 표현식은 함수에 전달되거나 함수에서 반환될 수 있는 다양한 인수에 대해 더 짧은 코드를 작성하는 데 사용됩니다. 함수의 인수 및 반환 문으로 여러 변수를 사용할 수 있습니다.

구문:-

  • 단항 오른쪽 접기 - ( 포장 op1 ... )

  • 단항 왼쪽 접기 - ( … op1 팩 )

  • 바이너리 왼쪽 접기 - ( 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의 이름이 됩니다. 요소의 수는 식별자의 수와 같아야 합니다.

    정수 배열[3] ={ 3,4,5 };

    자동 [a,b,c] =arry;

    //여기서 배열이 생성되고 a는 3, b는 4, c는 5를 나타냅니다.

  • 사례 2:유형과 같은 튜플 바인딩

    부동 소수점 숫자{};

    문자 ch1{};

    정수{};

    std::tuple tplex( fnum, std::move(ch1) , 숫자);

    const auto&[ p, q, r] =tplex;

    // p는 fnum을 참조하는 구조적 바인딩의 이름입니다.

    // q는 ch1을 참조하는 구조화된 바인딩의 이름입니다.

    // r은 숫자를 참조하는 구조화된 바인딩의 이름입니다.

  • 사례 3:- 데이터 구성원에 대한 바인딩

    구조체 structVar {

    가변 정수 num1 :2;

    휘발성 더블 num2;

    };

    structVar func();

    const 자동 [ a, b] =func();

    // a는 2비트 비트 필드에 대한 int lvalue입니다.

    // b는 const 휘발성 double lvalue입니다.

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. 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 ) { 
   //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 {
      ..........
}; }