首頁  >  文章  >  後端開發  >  為什麼我的列印堆疊和佇列通用函數失敗,如何修復?

為什麼我的列印堆疊和佇列通用函數失敗,如何修復?

DDD
DDD原創
2024-11-01 22:17:02939瀏覽

Why Does My Generic Function for Print Stacks and Queues Fail, and How Can I Fix It?

函數失敗的原因以及如何解決問題

提供的程式碼嘗試建立一個可以列印堆疊和佇列的通用函數。然而,它由於一個根本問題而失敗:if-else 語句的兩個分支都必須是可編譯的。在這種情況下,它們不是。

發生錯誤的具體原因是 top() 成員函數僅適用於堆疊,而 front() 成員函數僅適用於佇列。當嘗試為相同容器類型編譯兩個分支時,編譯器會標記該問題,因為它無法確定要使用哪個成員函數。

此問題的一種解決方案是使用部分特化。部分專業化可讓您為特定類型或類別定義範本的不同實作。在這種情況下,您可以為堆疊和佇列定義部分特化,確保每個實作都有適當的成員函數:

<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();
    }
}

此解決方案使用類別element_accessor 來存取每個容器類型的適當成員函數。透過為堆疊和佇列提供部分特化,您可以確保為每種情況編譯正確的程式碼。

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>

此解決方案利用 constexpr 條件表達式根據容器類型選擇正確的程式碼。透過在編譯時檢查 Cont 的類型,可以確保為每個容器呼叫正確的成員函數。

以上是為什麼我的列印堆疊和佇列通用函數失敗,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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