首頁 > 後端開發 > C++ > 當嘗試在函數中處理不同的容器類型時,為什麼 std::is_same 會失敗?

當嘗試在函數中處理不同的容器類型時,為什麼 std::is_same 會失敗?

Mary-Kate Olsen
發布: 2024-11-01 14:09:02
原創
271 人瀏覽過

Why does std::is_same fail when trying to process different container types in a function?

使用std::is_same:為什麼函數無法處理不同的容器類型

為了創建一個能夠列印堆疊和佇列的多功能函數,開發人員遇到編譯錯誤。儘管使用 std::is_same 來辨別容器的類型,但該函數仍然不起作用。

這個錯誤源自於 if-else 語句的兩個分支都必須成功編譯的事實,在本例中違反了這一點。為了解決這個問題,使用部分特化和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();
   }
}
登入後複製

或者,對於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>
登入後複製

以上是當嘗試在函數中處理不同的容器類型時,為什麼 std::is_same 會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板