為了創建一個能夠列印堆疊和佇列的多功能函數,開發人員遇到編譯錯誤。儘管使用 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& 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); 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>& 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中文網其他相關文章!