C++ 표준:모든 예

C Pyojun Modeun Ye



C++ 프로그래밍에서 표준 템플릿 라이브러리(STL)의 'std::any'는 이종 데이터를 처리하기 위한 동적 유형 지정을 도입합니다. 기존 컨테이너와 달리 'std::any'를 사용하면 단일 컨테이너 내에 모든 유형의 값을 저장할 수 있으므로 데이터 유형을 알 수 없거나 런타임 시 달라지는 시나리오에서 유연성이 향상됩니다. 이러한 유형에 구애받지 않는 접근 방식은 개발자가 유형 안전성을 유지하면서 보다 적응력 있고 표현력이 풍부한 코드를 만들 수 있도록 하는 일반 프로그래밍을 촉진합니다. 이번 탐구에서는 'std::any'의 기능, 사용 패턴, 그리고 강력하고 유연한 C++ 코드 작성 시 역할을 보여주는 실제 예제를 자세히 살펴보겠습니다.

예제 1: Std::Any의 기본 사용법

먼저 'std::any'의 기본적인 사용법을 보여주는 간단한 예를 살펴보겠습니다. 다양한 유형의 매개변수를 허용하는 함수가 필요한 시나리오를 생각해 보세요.







코드 조각은 다음과 같습니다.



#include
#include <모든 것>

무효 처리모든 ( const 표준::모든 & ) {
만약에 ( value.has_value ( ) ) {
표준::cout << '저장된 값의 유형: ' << 값.유형 ( ) .이름 ( ) << 표준::endl;

만약에 ( 값.유형 ( ) == 유형 ID ( 정수 ) ) {
표준::cout << '값: ' << 표준::any_cast < 정수 > ( ) << 표준::endl;
} 또 다른 만약에 ( 값.유형 ( ) == 유형 ID ( 더블 ) ) {
표준::cout << '값: ' << 표준::any_cast < 더블 > ( ) << 표준::endl;
} 또 다른 만약에 ( 값.유형 ( ) == 유형 ID ( 표준::문자열 ) ) {
표준::cout << '값: ' << 표준::any_cast < 표준::문자열 > ( ) << 표준::endl;
} 또 다른 {
표준::cout << '지원되지 않는 유형입니다!' << 표준::endl;
}
} 또 다른 {
표준::cout << 'std::any에 저장된 값이 없습니다.' << 표준::endl;
}
}

정수 메인 ( ) {
프로세스모두 ( 42 ) ;
프로세스모두 ( 3.14 ) ;
프로세스모두 ( 표준::문자열 ( '안녕하세요, std::any!' ) ) ;
프로세스모두 ( 4.5f ) ; // 지원되지 않음 유형

반품 0 ;
}


이 예에서는 'std::any' 참조를 매개변수로 사용하고 해당 내용을 검사하는 'processAny' 함수를 정의합니다. 함수 내에서 먼저 has_value()를 사용하여 'std::any' 변수에 저장된 값이 있는지 확인합니다. 값이 있으면 type().name()을 사용하여 저장된 값의 유형을 결정하고 해당 유형에 따라 해당 값을 인쇄합니다. 그런 다음 주 함수는 정수(42), double(3.14) 및 문자열('Hello, std::any!')과 같은 다양한 유형으로 호출하여 'processAny'의 유용성을 보여줍니다. 이 함수는 각 유형을 적절하게 처리하고 해당 값을 인쇄합니다. 그러나 이 예제에서 지원되지 않는 부동 소수점 숫자(4.5f)를 처리하려고 하면 프로그램은 해당 유형이 지원되지 않음을 표시하여 상황을 적절하게 처리합니다.



생성된 출력은 다음과 같습니다.






이는 'std::any'가 다양한 데이터 유형을 동적으로 처리하여 C++의 일반 프로그래밍을 위한 다목적 도구로 만드는 방법을 보여줍니다.

예 2: 사용자 정의 유형 저장

두 번째 예에서는 STL(표준 템플릿 라이브러리) 내의 이 동적 유형이 사용자 정의 데이터 구조를 원활하게 수용하는 방법을 살펴봅니다. 사용자 정의 유형인 포인트 구조에 초점을 맞춰 'std::any'가 이러한 구조의 인스턴스를 처리하는 방법을 보여줍니다.



코드는 다음과 같습니다.

#include
#include <모든 것>

클래스 마이클래스 {
공공의:
내 수업 ( 정수 값 ) : 데이터 ( ) { }

인쇄 데이터 무효 ( ) const {
표준::cout << 'MyClass의 데이터: ' << 데이터 << 표준::endl;
}

사적인:
정수 데이터;
} ;

정수 메인 ( ) {
std::모든 anyObject = MyClass ( 42 ) ;

만약에 ( anyObject.has_value ( ) ) {
자동 & myClassInstance = std::any_cast < 내 수업 &> ( 모든객체 ) ;
myClassInstance.printData ( ) ;
} 또 다른 {
표준::cout << 'std::any에 저장된 값이 없습니다.' << 표준::endl;
}

반품 0 ;
}


이 C++ 코드 조각에서는 'MyClass'라는 사용자 정의 클래스와 함께 'std::any' 유형을 사용하는 방법을 보여주는 간단한 예제를 만듭니다. 클래스 내에는 'data'라는 전용 멤버 변수와 이 데이터의 값을 표시하는 printData()라는 공용 메서드가 있습니다. 정수 값이 전달되어 생성자의 'data' 멤버에 할당됩니다.

'main' 함수에서는 초기 값 42로 'MyClass' 개체를 인스턴스화한 다음 'anyObject'라는 'std::any' 변수에 저장합니다. 이는 사용자 정의 클래스의 인스턴스를 보유하는 'std::any'의 기능을 보여줍니다.

이어서 has_value() 메서드를 사용하여 “anyObject”에 값이 있는지 확인하기 위해 “if” 문을 사용합니다. 값이 있으면 'std::any_cast'를 사용하여 저장된 객체를 검색합니다. 'std::any_cast'는 'MyClass&' 템플릿 인수와 함께 사용되어 저장된 개체를 'MyClass' 참조로 캐스팅합니다. 그런 다음 이 참조 'myClassInstance'는 printData() 메서드를 호출하는 데 사용되며 'std::any' 내에 저장된 사용자 정의 유형에 액세스하고 작동하는 기능을 보여줍니다.

'std::any'에 값이 저장되어 있지 않으면 이를 나타내는 메시지를 인쇄합니다. 이 조건부 확인을 통해 'std::any' 변수가 비어 있을 수 있는 시나리오를 처리할 수 있습니다.

출력은 다음과 같습니다.

예시 3: 혼합형 컨테이너

프로그래밍에서 '혼합 유형 컨테이너'는 잠재적으로 관련되지 않은 다양한 데이터 유형의 요소를 보유할 수 있는 데이터 구조를 의미합니다. 이러한 유연성은 컴파일 타임에 데이터 유형을 알 수 없거나 프로그램 실행 중에 동적으로 변경되는 시나리오를 처리할 때 유용합니다. C++에서는 'std::any'가 이 개념을 예시하며, 단일 컨테이너를 생성하여 다양한 유형의 값을 저장할 수 있습니다.

다양한 유형을 보유하는 컨테이너를 생성하는 시나리오를 살펴보겠습니다.

#include
#include <모든 것>
#include <벡터>

정수 메인 ( ) {

표준::벡터 < 표준::모든 > 혼합컨테이너;

혼합컨테이너.push_back ( 42 ) ;
혼합컨테이너.push_back ( 3.14 ) ;
혼합컨테이너.push_back ( 표준::문자열 ( '안녕하세요' ) ) ;
혼합컨테이너.push_back ( 진실 ) ;

~을 위한 ( const 자동 & 요소 : 혼합컨테이너 ) {
만약에 ( 요소.유형 ( ) == 유형 ID ( 정수 ) ) {
표준::cout << '정수: ' << 표준::any_cast < 정수 > ( 요소 ) << 표준::endl;
} 또 다른 만약에 ( 요소.유형 ( ) == 유형 ID ( 더블 ) ) {
표준::cout << '더블: ' << 표준::any_cast < 더블 > ( 요소 ) << 표준::endl;
} 또 다른 만약에 ( 요소.유형 ( ) == 유형 ID ( 표준::문자열 ) ) {
표준::cout << '끈: ' << 표준::any_cast < 표준::문자열 > ( 요소 ) << 표준::endl;
} 또 다른 만약에 ( 요소.유형 ( ) == 유형 ID ( 부울 ) ) {
표준::cout << '부울: ' << 표준::any_cast < 부울 > ( 요소 ) << 표준::endl;
} 또 다른 {
표준::cout << '알 수 없는 유형' << 표준::endl;
}
}

반품 0 ;
}


이 그림에서는 C++와 'std::any' 기능을 사용하여 혼합 유형 컨테이너의 개념을 보여줍니다. 다양한 데이터 유형의 요소를 보유하는 컨테이너 역할을 하기 위해 'mixedContainer'라는 이름의 'std::Vector'를 생성합니다. 'push_back' 함수를 사용하여 이 컨테이너를 정수(42), double(3.14), 문자열('Hello') 및 부울(true)을 포함한 다양한 요소로 채웁니다.

'for' 루프를 사용하여 'mixedContainer'를 반복하면서 type() 함수를 사용하여 각 요소의 데이터 유형을 동적으로 식별합니다. 'std::any_cast'를 활용하여 유형에 따라 해당 값을 추출하고 인쇄합니다. 예를 들어 요소의 유형이 'int'인 경우 정수로 인쇄합니다. 'double' 유형이면 double로 인쇄하는 식입니다.

생성된 출력은 다음과 같습니다.

예제 4: Std::Any를 사용한 오류 처리

'std::any' 사용 시 오류를 처리하려면 해당 유형이 지원되는지 또는 값이 저장되어 있는지 확인해야 합니다. 이 예에서는 지원되지 않는 유형을 처리하는 방법을 보여줍니다.

#include
#include <모든 것>

정수 메인 ( ) {
표준::모든 myAny = 42 ;

노력하다 {

이중 값 = std::any_cast < 더블 > ( 마이애니 ) ;
표준::cout << '값: ' << << 표준::endl;
} 잡다 ( const std::bad_any_cast & 그것은 ) {

표준::cerr << '오류: ' << e.뭐 ( ) << 표준::endl;
}

반품 0 ;
}


'std::any' 변수인 'myAny'를 정수 유형의 값 42로 초기화하는 것부터 시작합니다. 후속 'try' 블록 내에서 'std::any_cast' 작업을 사용하여 이 정수 값을 'double'로 캐스팅하려는 명시적인 시도를 합니다. 그러나 'myAny'에 저장된 실제 유형은 정수이므로 이 캐스팅 작업은 유형 불일치로 이어지는 'double'에 대해 유효하지 않습니다.

이 잠재적 오류를 적절하게 관리하기 위해 'std::bad_any_cast'의 특정 예외 유형을 포착하도록 설계된 'catch' 블록을 사용하여 예외 처리를 구현합니다. 캐스팅에 실패하는 경우 'catch' 블록이 활성화되고 'std::cerr'을 사용하여 오류 메시지를 생성하여 오류의 성격을 전달합니다. 이 오류 처리 전략은 우리 프로그램이 시도된 유형 캐스트가 “std::any” 변수에 저장된 실제 유형과 충돌하는 상황을 적절하게 처리할 수 있도록 보장합니다.

결론

이 기사에서는 다양한 유형의 값을 위해 C++에 도입된 동적 유형 컨테이너인 'std::any'를 C++에서 적용하는 방법을 살펴보았습니다. 우리는 기본 사용법부터 사용자 정의 유형 및 이기종 컬렉션 처리에 이르기까지 다양한 시나리오를 보여주는 다양한 예제를 통해 그 다양성을 입증했습니다. 우리는 컴파일 타임에 데이터 유형을 알 수 없는 시나리오에서 실제 적용을 시연했습니다. 또한 오류 처리 기술에 대해 살펴보며 예외 처리를 통해 지원되지 않는 유형을 적절하게 관리하는 것의 중요성을 강조했습니다.