首页  >  文章  >  后端开发  >  为什么我的打印堆栈和队列通用函数失败,如何修复?

为什么我的打印堆栈和队列通用函数失败,如何修复?

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