C/C : 비정수 값에 대한 Switch 문
switch 문에서는 비정수 값을 기반으로 작업을 수행해야 하는 경우가 많습니다. 정수 값. 불행하게도 C/C에서 switch 문은 정수 표현식에만 사용할 수 있습니다.
간단한 접근 방식
비정수 스위치 문을 처리하는 간단한 솔루션은 다음과 같습니다. 일련의 if-else 문을 사용합니다.
if (str == "foo") { ... } else if (str == "bar") { ... } else { ... }
그러나 이 접근 방식은 장황하고 비효율적입니다. (O(n), 여기서 n은 사례 수), switch 문의 우아함이 부족합니다.
매크로 및 템플릿 요령
매크로 및 템플릿 사용 , 컴파일 타임에 이진 검색을 구현할 수 있습니다.
#define NEWMATCH MATCH("asd") some c++ code MATCH("bqr") ... the buffer for the match is in _buf MATCH("zzz") ... user.YOURSTUFF /*ELSE optional */ ENDMATCH(xy_match)
이는 이진 검색을 자동으로 수행하는 xy_match 함수를 생성합니다. 각 사례에 적합한 코드를 검색하고 호출합니다. 이 접근 방식은 효율적이지만(O(log n)) 표준 스위치 문만큼 간단하지는 않습니다.
C 11 Enhancements
C 11에서는 람다 및 정수가 아닌 스위치 문의 명확성을 크게 향상시키는 초기화 목록:
template <typename KeyType, typename FunPtrType, typename Comp> void Switch(const KeyType &value,std::initializer_list<std::pair<const KeyType,FunPtrType>> sws,Comp comp) { auto r=std::lower_bound(sws.begin(),sws.end(),val,cmp); if ( (r!=sws.end())&&(!cmp(val,*r)) ) { r->second(); } }
이 템플릿은 정수가 아닌 스위치 문을 구현하는 간결하고 효율적인 방법입니다.
컴파일 타임 트라이
보다 최근의 발전에는 메타프로그래밍을 활용하여 컴파일 타임에 검색 트라이를 생성하는 것이 포함됩니다. 이 접근 방식은 정렬되지 않은 비정수 스위치 문을 처리하고 컴파일러의 코드 생성기를 사용하여 효율적인 코드를 생성합니다.
Switch<const char *,void (*)()>("ger",{ // sorted: {"asdf",[]{ printf("0\n"); }}, {"bde",[]{ printf("1\n"); }}, {"ger",[]{ printf("2\n"); }} },[](const char *a,const char *b){ return strcmp(a,b)<0;});
이 접근 방식은 C/C에서 정수가 아닌 스위치 문의 효율성과 가독성을 더욱 향상시킵니다.
위 내용은 C/C에서 정수가 아닌 값을 사용하여 Switch 문을 어떻게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!