> 백엔드 개발 > C++ > 본문

일반 컨테이너를 인쇄할 때 `std::is_same`이 실패하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-02 19:50:30
원래의
618명이 탐색했습니다.

Why Does `std::is_same` Fail When Printing Generic Containers?

일반 컨테이너 인쇄에 대한 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>&amp; s) const { return s.top(); }
};

template <typename T>
struct element_accessor<std::queue<T>> {
   const T& operator()(const std::queue<T>&amp; q) const { return q.front(); }
};

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

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