> 백엔드 개발 > C++ > C/C에서 정수가 아닌 값을 사용하여 Switch 문을 어떻게 구현할 수 있습니까?

C/C에서 정수가 아닌 값을 사용하여 Switch 문을 어떻게 구현할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-11-30 06:28:11
원래의
756명이 탐색했습니다.

How Can I Implement Switch Statements with Non-Integer Values in C/C  ?

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 &amp;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())&amp;&amp;(!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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿