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