C++ 표준::선택 사항

C Pyojun Seontaeg Sahang



'std::ional' 기능은 C++17에서 제공됩니다. 'std::ional'을 사용하면 선택적 값을 형식에 맞게 표현하거나 값을 선택할 수 있습니다. 'std::ional'이라는 템플릿 클래스에는 유효한 값이 포함될 수도 있고 포함되지 않을 수도 있는 선택적 값이 포함되어 있습니다. 원시 포인터나 기타 기술보다 비어 있거나 선택적 값을 나타내는 것이 더 안전한 대체 방법입니다. 'std::ional'은 사용자가 값을 검색하기 전에 값이 존재하는지 명시적으로 확인하도록 요구하여 널 포인터 역참조 오류의 가능성을 최소화합니다.

예시 1:

이 코드에서는 '선택적' 및 'iostream' 헤더 파일을 가져옵니다. 헤더 파일에 정의된 함수에 쉽게 액세스할 수 있도록 이러한 헤더 파일을 가져와야 합니다. 그 후에는 'namespace std'를 포함하므로 'std::ional' 및 'std::cout'과 같은 기능을 별도로 입력할 필요가 없습니다. 여기서는 '네임스페이스 표준'을 사용합니다. 따라서 이제 'std'를 입력하지 않고 '선택 사항' 또는 'cout'을 배치합니다.

그런 다음 main()을 호출하고 '선택적'을 배치하고 'int'로 설정하고 'myNum'을 선언합니다. “std::ional” 변수를 선언하는 구문입니다. 그런 다음 'value'라는 다른 변수를 초기화하고 value_or() 함수를 활용하여 'myNum' 변수에 값을 할당합니다. 이 함수에 '99'를 전달하므로 값이 없으면 이 '99'를 'muNum' 변수에 할당하고 이를 'value' 변수에 저장합니다. 그런 다음 위의 변수에 할당한 값을 표시하는 데 도움이 되는 'cout'을 이 아래에 배치합니다.







코드 1:

#include <선택사항>

#include

네임스페이스 표준 사용 ;

정수 기본 ( ) {

선택 과목 < 정수 > 내번호 ;

정수 = myNum. 값_또는 ( 99 ) ;

시합 << 'myNum의 값은: ' << << ;

반품 0 ;

}

산출:



여기서는 '99'가 표시된 것을 알 수 있는데, 이는 위에 값이 존재하지 않고 추가한 값이 해당 변수에 할당되었음을 의미합니다.







예 2:

먼저 헤더 파일을 포함하고 '네임스페이스 표준'을 배치합니다. 이제 그 아래에 'divideFunc()'인 'std::ional' 함수를 선언합니다. '나누기'와 '제수'는 이 함수의 두 매개변수입니다. 그런 다음 그 아래에 'divisior != 0'이라는 조건을 추가하는 'if'를 활용합니다. 이것이 만족되면 안에 'return'을 추가하여 이 나눗셈의 답을 반환합니다. 그렇지 않으면 안전 유형 값이 없음을 의미하는 'nullopt'를 반환합니다. 이제 main()을 호출합니다. 'std::ional'을 추론하기 위해 'divideFunc()'를 배치하고 '27, 3'을 추가하고 결과를 'quotient' 변수에 할당합니다.

여기서는 'auto' 키워드를 활용하여 데이터 유형을 자동으로 조정합니다. 그 다음에는 유형 값이 수신되는지 여부를 결정하는 'has-value'를 활용하는 'if'를 추가합니다. 그런 다음 'quotient' 변수에 저장된 결과를 렌더링하는 'cout'을 배치하고 'else' 부분에는 제수가 0임을 렌더링하는 명령문이 포함되어 있습니다.



코드 2:

#include

#include <선택사항>

네임스페이스 표준 사용 ;

선택 과목 < 정수 > DivideFunc ( 정수 피제수 , 정수 분할기 ) {

만약에 ( 분할기 != 0 ) {

반품 피제수 / 분할기 ;

}

반품 널옵트 ;

}

정수 기본 ( ) {

자동 = DivideFunc ( 27 , ) ;

만약에 ( 몫. has_value ( ) ) {

시합 << '몫은: ' << 몫. ( ) << ;

} 또 다른 {

시합 << '여기서 제수는 0입니다' << ;

}

반품 0 ;

}

산출:

출력은 나누기 후 결과를 렌더링합니다. 이는 나누기가 0이 아님을 의미합니다. 이 경우 'std::ional'은 값이 유형에 맞게 존재하는지 여부를 결정하는 데 사용됩니다.

예시 3:

여기서는 main() 내부의 '숫자'인 'std::ional' 변수를 선언합니다. 그런 다음 이 'number' 변수와 함께 has_value() 함수를 배치하는 'if'를 활용합니다. 이 '숫자' 변수에 값이 있는지 여부를 확인합니다. 'number' 변수에 값이 포함되어 있으면 'if' 뒤에 추가한 명령문을 렌더링합니다. 그렇지 않으면 'else' 뒤에 배치한 명령문을 렌더링합니다.

이제 '숫자'를 '92'로 초기화하고 'if를 조건으로'의 '숫자' 변수와 함께 has_value() 함수가 추가된 이 아래에서 다시 'if'를 활용합니다. 이는 '숫자' 변수에 값이 있는지 여부를 결정합니다. “if” 뒤에 추가하는 문장은 “number” 변수에 값이 있는 경우 렌더링됩니다. 그렇지 않은 경우 'else' 뒤에 배치한 명령문이 렌더링됩니다.

코드 3:

#include

#include <선택사항>

정수 기본 ( ) {

성병 :: 선택 과목 < 정수 > 숫자 ;

만약에 ( 숫자. has_value ( ) ) {

성병 :: 시합 << '번호가 존재합니다: ' << 숫자. ( ) << 성병 :: ;

} 또 다른 {

성병 :: 시합 << '번호가 없습니다.' << 성병 :: ;

}

숫자 = 92 ;

만약에 ( 숫자. has_value ( ) ) {

성병 :: 시합 << '번호가 존재합니다: ' << 숫자. ( ) << 성병 :: ;

} 또 다른 {

성병 :: 시합 << '번호가 없습니다.' << 성병 :: ;

}

반품 0 ;

}

산출:

'std::ional' 변수에 값을 할당하지 않기 때문에 'else' 부분이 먼저 렌더링됩니다. 그런 다음 이 변수에 값을 할당하여 다음 줄에 해당 값을 표시합니다.

예시 4:

이제 'n1', 'n2' 및 'n3'인 세 개의 'std::ional' 변수를 선언합니다. 또한 각각 '29'와 '45'인 'n2' 및 'n3' 변수에 값을 할당합니다. 여기서는 'std::ional' 클래스의 'n1' 변수가 비어 있습니다. 이제 '1'과 '0'이 아닌 'true' 또는 'false' 형식으로 반환을 반환하는 데 도움이 되는 'boolalpha'를 활용합니다.

그런 다음 'std::ional' 변수 사이에 관계 연산자를 활용하고 각 명령문을 'cout' 안에 배치하여 추가한 비교 결과도 렌더링합니다. 먼저 'n3 > n2', 'n3 < n2', 'n1 < n2', 'n1 == std::nullopt '를 확인합니다. 여기서는 안전 유형이 없는 값과 null을 비교하기 위해 “nullopt”를 활용합니다. 그런 다음 'cout' 문 내부에서 'n2 == 49'와 'n3 == 88'을 별도로 확인합니다.

코드 4:

#include <선택사항>

#include

정수 기본 ( )

{

성병 :: 선택 과목 < 정수 > n1 ;

성병 :: 선택 과목 < 정수 > n2 ( 29 ) ;

성병 :: 선택 과목 < 정수 > n3 ( 넷 다섯 ) ;

성병 :: 시합 << 성병 :: 영숫자 ;

성병 :: 시합 << 'n3 > n2' << ( n3 > n2 ) << 성병 :: ;

성병 :: 시합 << 'n3 < n2' << ( n3 < n2 ) << 성병 :: ;

성병 :: 시합 << 'n1 < n2 ' << ( n1 < n2 ) << 성병 :: ;

성병 :: 시합 << 'n1 == null ' << ( n1 == 성병 :: 널옵트 ) << 성병 :: ;

성병 :: 시합 << 'n2 == 49' << ( n2 == 29 ) << 성병 :: ;

성병 :: 시합 << 'n3 == 88' << ( n3 == 88 ) << 성병 :: ;

}

산출:

이전에 언급한 C++ 프로그램은 'std::ional' 유형의 다양한 변수 값을 비교하는 동시에 결과를 출력으로 인쇄합니다.

예시 5:

이 코드에 포함된 헤더 파일은 “iostream”, “fstream”, “Optional”, “string”입니다. 'fstream'에는 이 코드에 필요한 'ofstream'과 'ifstream' 함수의 정의가 모두 포함되어 있습니다. 이제 '네임스페이스 표준'을 포함하므로 각 기능마다 별도로 배치하지 않습니다. 그런 다음 'std:ional'을 활용하고 'const string& f_Name'을 인수로 전달하는 'ReadFileFunc'라는 이름의 함수를 선언합니다.

그런 다음 'f_name' 변수에 이름이 추가될 파일을 읽는 데 도움이 되는 'ifstream'이 있습니다. 그런 다음 파일이 열리지 않으면 'if' 문 아래에 추가한 대로 'nullopt'를 반환한다는 조건을 포함하는 'if'를 활용합니다. 그런 다음 파일이 열리면 파일에 내용을 쓰는 데 도움이 되는 'fileContent'라는 또 다른 함수를 만듭니다. 여기서는 파일을 연 후 파일에 추가한 콘텐츠를 반환하는 'return fileContent'를 다시 배치합니다.

이제 여기서는 열려고 하는 'Sample.txt' 파일 이름으로 'f_Name' 변수를 초기화하는 'main()'을 호출합니다. 그런 다음 여기에서 'ReadFileFunc()'를 호출하고 파일 읽기를 시도하고 해당 내용을 'f_content' 변수에 저장하는 이 함수에 'f_Name' 변수를 전달합니다. 그 아래에서는 'if'의 'f_content' 변수와 함께 'has_value()'를 활용합니다. 이 변수에 값이 포함되어 있으면 'f_content'도 배치한 'if' 아래에 'cout'을 추가하여 값도 렌더링합니다. 그렇지 않으면 “else” 뒤에 추가한 오류가 표시됩니다.

코드 5:

#include

#include

#include <선택사항>

#include <문자열>

네임스페이스 표준 사용 ;

선택 과목 < > ReadFileFunc ( const & f_이름 ) {

ifstream 마이파일 ( f_이름 ) ;

만약에 ( ! myFile.myFile. is_open ( ) ) {

반품 널옵트 ;

}

문자열 파일 내용 ( ( isstreambuf_iterator < > ( 내파일 ) ) , isstreambuf_iterator < > ( ) ) ;

반품 파일콘텐츠 ;

}

정수 기본 ( ) {

const 문자열 f_이름 = '샘플.txt' ;

자동 f_content = ReadFileFunc ( f_이름 ) ;

만약에 ( f_content. has_value ( ) ) {

시합 << '파일 내용은 다음과 같습니다. \N ' << f_content. ( ) << ;

} 또 다른 {

세르 << '오류: 파일이 여기서 열리지 않았습니다.' << f_이름 << ;

}

반품 0 ;

}

산출:

여기서는 주어진 코드의 결과로 'else' 부분에 추가한 오류 문을 보여줍니다.

결론

이 튜토리얼에서는 'std::Optional'이라는 강력한 C++ 기능을 탐색하고 이 기능이 선택적 값을 나타내는 표준화된 방법을 제공하고 Null 참조에 대한 요구 사항을 없애고 명확성과 코드 안전성을 향상시키는 방법을 설명했습니다. 복잡한 문제를 설명하고 실수를 우아하게 처리하는 능력도 향상된다는 점을 배웠습니다.