Why the Function Fails and How to Resolve the Issue
The provided code attempts to create a generic function that can print both stacks and queues. However, it fails due to a fundamental issue: both branches of the if-else statement must be compilable. In this case, they are not.
The error occurs specifically because the top() member function is only available for stacks, while the front() member function is only available for queues. The compiler flags the problem when trying to compile both branches for the same container type, as it cannot determine which member function to use.
One solution to this problem is to use partial specialization. Partial specialization allows you to define different implementations of a template for specific types or classes. In this case, you can define partial specializations for stacks and queues, ensuring that each implementation has the appropriate member function:
<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(); } }
This solution uses a class element_accessor to access the appropriate member function for each container type. By providing partial specializations for stacks and queues, you ensure that the correct code is compiled for each case.
Another solution, available in C 17 and later, is to use 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>
This solution utilizes constexpr conditional expressions to select the correct code based on the container type. By checking the type of Cont at compile time, you can ensure that the correct member function is called for each container.
The above is the detailed content of Why Does My Generic Function for Print Stacks and Queues Fail, and How Can I Fix It?. For more information, please follow other related articles on the PHP Chinese website!