为了创建一个能够打印堆栈和队列的多功能函数,开发人员遇到编译错误。尽管使用 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中文网其他相关文章!