>  기사  >  백엔드 개발  >  `print_container` 함수에서 발생하는 유형 불일치 오류를 어떻게 해결할 수 있나요?

`print_container` 함수에서 발생하는 유형 불일치 오류를 어떻게 해결할 수 있나요?

DDD
DDD원래의
2024-11-01 12:20:30534검색

How can I resolve type mismatch errors occurring in a `print_container` function?

print_container 함수의 유형 불일치 오류 해결

print_container 함수가 실패하는 이유를 이해하려면 std::is_same 템플릿의 속성을 분석해야 합니다. 이 함수는 두 유형을 비교하여 동일하면 true를 반환합니다. 이 경우 std::is_same을 사용하여 Cont 컨테이너 유형이 스택 또는 큐와 동일한지 확인합니다. 그러나 if-else 문의 분기는 컨테이너의 정확한 유형에 따라 달라지며, 두 분기 모두 컴파일 가능해야 하므로 컴파일 오류가 발생합니다.

해결책 1: 부분 특수화

한 가지 해결책은 부분 특수화를 사용하여 스택 및 대기열 유형에 대한 element_accessor의 별도 구현을 생성하는 것입니다. 이를 통해 특정 컨테이너 유형을 기반으로 요소 추출을 처리할 수 있습니다. 구현 예는 다음과 같습니다.

<code class="cpp">template <typename Cont>
struct element_accessor;

template <typename T>
struct element_accessor<std::stack<T>> {
   const T&amp; operator()(const std::stack<T>&amp; s) const { return s.top(); }
};

template <typename T>
struct element_accessor<std::queue<T>> {
   const T&amp; 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);
      std::cout << elem << '\n';
      cont.pop();
   }
}

이 솔루션에서 element_accessor는 스택의 최상위 요소와 대기열의 전면 요소에 액세스하는 일관된 방법을 제공하여 유형 불일치 문제를 해결합니다.

해결책 2: if constexpr(C 17)

C 17 이상을 사용하는 경우 if constexpr 구문을 활용하여 템플릿 유형 매개변수를 기반으로 분기를 구현할 수 있습니다. 다음은 print_container 함수의 수정된 버전입니다.

<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>

이 버전에서 if constexpr 분기는 템플릿 유형 매개변수를 기반으로 컴파일 타임에 평가됩니다. 이는 부분 전문화의 필요성을 제거하고 유형 안전성을 보장합니다.

위 내용은 `print_container` 함수에서 발생하는 유형 불일치 오류를 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.