일반 컨테이너 인쇄에 대한 std::is_same: 실패하는 이유 및 해결 방법
일반 함수를 작성하려고 할 때 문제가 발생했습니다. 스택 및 큐 컨테이너를 모두 인쇄합니다. 함수에는 처음에 컨테이너 유형(스택 또는 큐)을 결정하고 그에 따라 해당 요소에 액세스하기 위한 조건문이 포함되었습니다. 그러나 이 접근 방식에서는 두 컨테이너 유형 간의 멤버 함수 차이로 인해 컴파일 오류가 발생했습니다.
문제 이해:
컴파일 오류는 다음과 같은 사실에서 비롯됩니다. if-else 문의 분기는 스택 유형의 front() 및 대기열 유형의 top()에 액세스하려고 시도합니다. 이러한 접근자는 해당 유형에서 사용할 수 없으므로 컴파일러가 불만을 표시합니다. C에는 강력한 유형 지정이 있으므로 지원하는 해당 멤버 함수와 함께 특정 유형을 제공해야 합니다.
문제 해결:
이 문제를 해결하려면 다음이 필요합니다. 특정 멤버 기능에 대한 액세스를 계속 제공하면서 컨테이너 유형을 구별할 수 있는 솔루션입니다. 가능한 두 가지 해결 방법은 다음과 같습니다.
1. 접근자를 사용한 부분 특수화:
한 가지 접근 방식은 부분 템플릿 특수화를 사용하고 각 컨테이너 유형에 대한 접근자 함수를 정의하는 것입니다. 이 접근자 함수는 필요에 따라 상단 또는 전면 요소를 검색합니다.
<code class="cpp">template <typename Cont> struct element_accessor; template <typename T> struct element_accessor<std::stack<T>> { const T& operator()(const std::stack<T>& s) const { return s.top(); } }; template <typename T> struct element_accessor<std::queue<T>> { const T& operator()(const std::queue<T>& q) const { return q.front(); } }; template<typename Cont> void print_container(Cont& cont){ while(!cont.empty()){ auto elem = element_accessor<Cont>{}(cont); // call the accessor function std::cout << elem << '\n'; cont.pop(); } }
2. if constexpr with C 17:
개발 환경이 C 17을 지원하는 경우 컴파일 시간 평가를 수행하고 컨테이너 유형에 따라 조건부 실행을 허용하는 if constexpr 문을 활용할 수 있습니다.
<code class="cpp">template<template<class> typename Cont, typename T> void print_container(Cont<T>& cont){ while(!cont.empty()){ if constexpr (std::is_same_v<Cont<T>, std::stack<T>>) std::cout << cont.top() << '\n'; else if constexpr (std::is_same_v<Cont<T>, std::queue<T>>) std::cout << cont.front() << '\n'; cont.pop(); } }</code>
두 솔루션 모두 스택 및 큐 컨테이너를 모두 인쇄할 수 있는 일반 함수를 작성하여 DFS 및 BFS와 같은 검색 알고리즘 간에 코드를 효과적으로 공유할 수 있습니다.
위 내용은 일반 컨테이너를 인쇄할 때 `std::is_same`이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!