C/C에서 정수가 아닌 값 켜기
문제:
조치 결정 POD가 아닌 상수 요소(예: 문자열)를 기반으로 하는 경우 해결 방법이 필요합니다. 비효율적이고 복잡할 수 있는 중첩된 ifs와 같습니다. 정수 값용으로 설계된 스위치 문은 정수가 아닌 값을 직접 지원하지 않습니다.
해결 방법 1: 매크로 및 템플릿 매직(fastmatch.h)
매크로 및 템플릿 사용 템플릿을 사용하면 컴파일 타임에 펼쳐진 이진 검색을 만들 수 있습니다. 구문은 간결하지만 정렬된 케이스 분기가 필요합니다. 이 접근 방식은 관련 일치 항목을 버퍼에 할당하는 암시적 중단이 있는 함수를 생성합니다.
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("bqr",youruserdata);
해결책 2: C 11 람다 및 초기화 목록
C 11 , 람다 및 초기화 목록은 더 깔끔한 솔루션을 제공합니다. 이 접근 방식은 키-값 쌍 목록에서 이진 검색을 수행합니다. 여기서 키는 정수가 아닌 값에 해당하고 값은 함수 포인터입니다. 그런 다음 발견된 함수가 호출됩니다.
#include <utility> #include <algorithm> #include <initializer_list> template <typename KeyType, typename FunPtrType, typename Comp> void Switch(const KeyType &value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) { // ... search and invoke code } Switch("ger",{ {"asdf",[]{ printf("0\n"); }}, {"bde",[]{ printf("1\n"); }}, {"ger",[]{ printf("2\n"); }} },[](const char *a,const char *b){ return strcmp(a,b)<0;});
해결책 3: 컴파일 타임 트라이(cttrie)
C 11에서 컴파일 타임 트라이 접근 방식은 정렬되지 않은 함수를 처리할 수 있습니다. 케이스가 쉽게 분기됩니다. 고급 메타프로그래밍 기술은 실행 흐름을 효율적으로 리디렉션하기 위해 각 트리 노드의 스위치 문을 활용하여 컴파일 타임에 검색 트리를 생성합니다.
전체 구현은 github: smileingthax/cttrie에서 확인할 수 있습니다.
위 내용은 C/C에서 정수가 아닌 값에 대한 Switch 문을 효율적으로 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!