你的目的是創建一個通用函數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< ;類別>型別名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中文網其他相關文章!