首頁 >後端開發 >C++ >為什麼我的函式無法使用'std::is_same”處理多個容器類型?

為什麼我的函式無法使用'std::is_same”處理多個容器類型?

Linda Hamilton
Linda Hamilton原創
2024-11-01 07:23:30410瀏覽

Why Can't My Function Handle Multiple Container Types Using `std::is_same`?

為什麼你的函數無法使用std::is_same 處理多個容器類型

你的目的是創建一個通用函數print_container,它可以打印以下元素棧堆和隊列容器。然而,儘管使用 std::is_same 檢查容器類型,您的函數還是會遇到錯誤。

錯誤原因:

錯誤的出現是因為 if 的兩個分支-else 語句必須是可編譯的。在您的情況下,當 Cont 為 std::stack 時,將存取前面的成員函數,該函數在 std::stack 中不存在。同樣,當Cont為std::queue時,存取的是top成員函數,該函數在std::queue中不存在。

部分特化解:

一個可能的解決方案是使用部分特化來單獨處理每種容器類型:

 <br>template <typename cont><br>struct element_accessor;<p>template <typename t><br>struct element_accessor<:stack>>; {<br> const T& 運算子() (const std::stack<t>& s) const { return s.top(); }<br>};</t></:stack></typename></p>
<p>模板<br>struct element_accessor<:queue t>>; {<br> const T& 運算子()(const std::queue<t>& q) const { return q.front(); }<br>};</t></:queue></p>
<p>模板<br>void print_container(Cont& cont){<br> while(!cont.empty()){</p>
<pre class="brush:php;toolbar:false">  auto elem = element_accessor<Cont>{}(cont);
  std::cout << elem << '\n';
  cont.pop();

}
}

此方法將元素的檢索委託給專門的element_accessor 函數,該函數為每種容器類型提供正確的存取器。

C 17 使用if constexpr 的解決方案:

如果您使用的是C 17 或更高版本,您也可以利用if constexpr 構造:

<br>template<template&lt ;類別>型別名Cont,型別名稱T><br>void print_container(Cont<T>& cont){<br> while(!cont.empty()){ </p><pre class="brush:php;toolbar:false">  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();

}
}

此解決方案使用if constexpr 根據容器類型有條件地執行適當的程式碼,避免了部分專業化的需要。

以上是為什麼我的函式無法使用'std::is_same”處理多個容器類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn