通用容器列印的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>& s) const { return s.top(); } }; template <typename T> struct element_accessor<std::queue<T>> { const T& operator()(const std::queue<T>& q) const { return q.front(); } }; template<typename Cont> void print_container(Cont& 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>& 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中文網其他相關文章!