std :: any in c
STD :: 모든 유형 안전 임의의 유형 저장 공구는 C 17에 도입되었습니다. 복제 가능한 유형을 저장하고 검색하는 데 사용할 수 있습니다. 이기종 데이터 컨테이너가 필요한 시스템 구성, 플러그인 인터페이스 등과 같은 시나리오에 적합합니다. 그것을 사용할 때는 복사 가능한 유형의 값을 저장된 값을 얻으려면 또는 직접 ( 이 패턴은 여러 가능한 유형을 처리 할 때 유용합니다. 이것은 안전한 파견을 위해 공허함을 확인할 수도 있습니다. 사용자 정의 유형이 저작권 인 한 저장할 수 있습니다. 참고 : 성능 비용 : 유형 삭제 및 동적 할당 (더 큰 유형의 경우)은 오버 헤드를 추가 할 수 있습니다. 가능한 경우 성능 약정 경로 암시 적 변환 없음 : 참고 : 문자열 리터럴은 기본적으로 std::any
In C로 작업하면 유형 검사를 관리하고 올바르게 액세스하는 한 모든 유형의 값을 안전하게 저장하고 검색 할 수 있습니다. C 17 표준 라이브러리의 일부이며 구성 시스템, 플러그인 인터페이스 또는 일반 데이터 소유자를 구축 할 때와 같은 이질적인 데이터 컨테이너가 필요할 때 유용합니다.std::any
효과적으로 사용하는 방법은 다음과 같습니다.
1. 기본 사용 및 기본 사용
std::any
사용하려면 <any></any>
헤더를 포함하십시오. #include <Any>
#include <iostream>
#include <문자열>
int main () {
std :: 모든 값 = 42; // int를 저장합니다
value = std :: string ( "hello"); // 이제 문자열을 저장하십시오
}
std::any
객체에 할당 할 수 있습니다. 2. std :: Any_cast로 값을 검색합니다
std::any_cast
사용하십시오. 이것은 데이터를 추출하는 유일한 안전한 방법입니다. 올바른 유형으로 검색 (성공)
std :: 모든 데이터 = 3.14;
if (auto* ptr = std :: Any_cast <doubl> (& data)) {
std :: cout << *ptr << '\ n';
}
std::bad_any_access
type mismatch에 던져짐) : 노력하다 {
double d = std :: Any_cast <double> (데이터);
std :: cout << d << '\ n';
} catch (const std :: bad_any_access &) {
std :: cout << "잘못된 유형! \ n";
}
포인터 캐스트가있는 안전한 검색
any_cast
의 포인터 버전 사용은 예외를 피합니다. if (const auto* str = std :: Any_cast <std :: string> (& data)) {
std :: cout << "문자열 :"<< *str << '\ n';
} else if (const auto* num = std :: Any_cast <int> (& data)) {
std :: cout << "정수 :"<< *num << '\ n';
}
3. 유형 확인 및 관리
.type()
사용하여 저장된 유형을 확인하고 typeid
와 비교할 수 있습니다. #include <typeinfo>
if (data.type () == typeid (std :: string)) {
std :: cout << "그것은 문자열입니다! \ n";
} else if (data.type () == typeid (int)) {
std :: cout << "정수입니다! \ n";
}
any_cast
와 함께 잘 작동합니다. 4. std :: any
std::any
빈을 만들려면 {}
할당하거나 .reset()
를 사용하십시오. data.reset (); // 이제 data.has_value ()가 false를 반환합니다
if (! data.has_value ()) {
std :: cout << "저장된 값 없음. \ n";
}
if (data.has_value ()) {
// 캐스트에 안전합니다
}
5. 사용자 정의 유형 저장
구조자 {
std :: 문자열 이름;
int 연령;
};
std :: 모든 p = person { "Alice", 30};
if (const auto* person = std :: Any_cast <person> (& p)) {
std :: cout << person-> name << ","<< person-> age << '\ n';
}
std::any
유형이 사본 구성 가능해야합니다. 랩핑되지 않으면 (아래 참조) 이동 전용 유형 ( std::unique_ptr
)은 작동하지 않습니다. 6. 제한 및 해결 방법
std::any
필요성 저작권. 그러나 std::unique_ptr
에서 이동 전용 유형을 래핑 할 수 있습니다. std :: 모든 래퍼 = std :: 고유 한 _ptr <int> (new int (42));
if (auto* ptr = std :: Any_cast <std :: 고유 _ptr <int >> (& 랩퍼)) {
std :: cout << "value :"<< ** ptr << '\ n';
}
std::any
피하십시오.int
까지 double
실패조차도 실패합니다. 정확한 저장된 유형을 추출해야합니다. 7. 실제 예 : 이종 용기
#include <vector>
#include <Any>
#include <문자열>
#include <iostream>
int main () {
std :: vector <std :: any> value = {1, "text", 3.14, std :: string ( "hello")};
for (const auto & v : value) {
if (v.type () == typeid (int)) {
std :: cout << "int :"<< std :: Any_cast <int> (v) << '\ n';
} else if (v.type () == typeid (const char*)) {
std :: cout << "char*:"<< std :: Any_cast <const char*> (v) << '\ n';
} else if (v.type () == typeid (double)) {
std :: cout << "double :"<< std :: Any_cast <double> (v) << '\ n';
} else if (v.type () == typeId (std :: string)) {
std :: cout << "문자열 :"<< std :: Any_cast <std :: string> (v) << '\ n';
}
}
}
std::string
이 아닌 const char*
이므로 조심하십시오.
std::any
유연성이 필요할 때 유형 안전 조합입니다. 다른 유형을 동일한 변수 나 컨테이너에 저장해야 할 때 사용하지만 캐스팅하기 전에 항상 유형을 확인하십시오. 템플릿이나 다형성을 대체하는 것이 아니라 특정 동적 유형 시나리오를위한 도구입니다.
위 내용은 std :: any in c의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT
더 현명한 결정을 위한 AI 기반 투자 연구

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

InstallaC compilerlikeg usingpackagemanagersordevelopmenttoolsdependingontheOS.2.WriteaC programandsaveitwitha.cppextension.3.Compiletheprogramusingg hello.cpp-ohellotogenerateanexecutable.4.Runtheexecutablewith./helloonLinux/macOSorhello.exeonWi

STD :: SYSTEM () 함수를 사용하여 System 명령을 실행하고 System 명령을 실행하고 STD :: SYSTEM ( "LS-L")과 같은 C 스타일 문자열 명령을 전달해야하며 리턴 값은 -1이므로 명령 프로세서를 사용할 수 없습니다.

Custom 할당자를 사용하여 C 컨테이너의 메모리 할당 동작을 제어 할 수 있습니다. 1. 예제의 LoggingAllocator는 할당, 거래, 구성 및 방법을 오버로드하여 메모리 작동 로깅을 구현합니다. 2. 할당자는 STL 컨테이너 유형 변환 요구 사항을 충족시키기 위해 value_type 및 Rebind 템플릿을 정의해야합니다. 3. 할당자는 시공 및 복사 중에 로그 출력을 트리거하며, 이는 수명주기를 추적하기에 편리합니다. 4. 실제 애플리케이션에는 메모리 풀, 공유 메모리, 디버깅 도구 및 임베디드 시스템이 포함됩니다. 5. C 17 이후로 구성 및 파괴는 기본적으로 std :: allocator_traits에 의해 처리 될 수 있습니다.

답은 필요한 유형 별칭 및 작업이 포함 된 클래스를 정의하는 것입니다. 먼저, value_type, 참조, 포인터, Different_type 및 iterator_category를 설정 한 다음 Dereference, ycrement 및 비교 작업을 구현하십시오. 마지막으로, 컨테이너에 시작 () 및 end () 메소드를 제공하여 반복자 인스턴스를 반환하여 STL 알고리즘 및 루프의 범위와 호환됩니다.

추상 클래스는 하나 이상의 순수한 가상 함수를 포함하는 클래스입니다. 인스턴스화 할 수 없으며 기본 클래스로 상속되어야합니다. 파생 클래스는 모든 순수한 가상 함수를 구현해야하며, 그렇지 않으면 여전히 추상 클래스가됩니다. 1. 순수한 가상 함수는 가상 반환 유형 함수 이름 () = 0으로 선언됩니다. 인터페이스 사양을 정의하기 위해; 2. 초록 클래스는 종종 다형성 호출을 구현하기 위해 area (), draw () 등과 같은 통합 인터페이스 설계에 사용됩니다. 3. 가상 파괴자는 추상 클래스 (예 : Virtual ~ shape () = 기본값;)에 제공되어 기본 클래스 포인터를 통해 파생 클래스 객체가 올바르게 릴리스되도록해야합니다. 4. 파생 클래스 상속 후, 사각형 및 원과 같은 순수한 가상 함수를 다시 작성하여 각 영역을 계산하기 위해 영역 ()을 구현해야합니다. 5.

실시간 시스템은 결과 전달 시간에 달려 있기 때문에 결정 론적 응답이 필요합니다. 하드 실시간 시스템은 엄격한 마감일이 필요하고, 누락 된 경우, 부드러운 실시간은 때때로 지연을 허용합니다. 스케줄링, 인터럽트, 캐시, 메모리 관리 등과 같은 비 결정적 요인 등은 타이밍에 영향을 미칩니다. 건설 계획에는 RTO, WCET 분석, 리소스 관리, 하드웨어 최적화 및 엄격한 테스트 선택이 포함됩니다.

AstaticVariableinc는 indainsvaluebetsweenfunctioncallsandisinitializedonce.2.insideafunction, itpreservesstateacrosscalls, suchascountingiterations.3.inaclass, itissharedamongallinstancesand mustedefinedoupedoutsideclasstoavoidingerrors.4.4

std :: ifstream 및 std :: istreambuf_iterator를 사용하여 파일의 전체 내용을 공백 및 라인 브레이크를 포함하여 문자열에 효율적으로 읽고 중간 크기의 텍스트 파일에 적합합니다.
