你的目的是创建一个通用函数 print_container,它可以打印以下元素堆栈和队列容器。然而,尽管使用 std::is_same 检查容器类型,您的函数还是会遇到错误。
错误原因:
错误的出现是因为 if 的两个分支-else 语句必须是可编译的。在您的情况下,当 Cont 为 std::stack 时,将访问前面的成员函数,该函数在 std::stack 中不存在。同样,当Cont为std::queue时,访问的是top成员函数,该函数在std::queue中不存在。
部分特化解:
一种可能的解决方案是使用部分特化来单独处理每种容器类型:
<br>template <typename cont><br>struct element_accessor;<p>template <typename t><br>struct element_accessor<:stack>>; {<br> const T& 运算符()(const std::stack<t>& s) const { return s.top(); }<br>};</t></:stack></typename></p> <p>模板 <br>struct element_accessor<:queue>>; {<br> const T& 运算符()(const std::queue<t>& q) const { return q.front(); }<br>};</t></:queue></p> <p>模板<br>void print_container(Cont& cont){<br> while(!cont.empty()){</p> <pre class="brush:php;toolbar:false"> auto elem = element_accessor<Cont>{}(cont); std::cout << elem << '\n'; cont.pop();
}
}
此方法将元素的检索委托给专门的 element_accessor 函数,该函数为每种容器类型提供正确的访问器。
C 17 使用 if constexpr 的解决方案:
如果您使用的是 C 17 或更高版本,您还可以利用 if constexpr 构造:
<br>template<template cont t><br>void print_container(Cont<t>& cont){<br> while(!cont.empty()){<pre class="brush:php;toolbar:false"> 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();
}
}
此解决方案使用 if constexpr 根据容器类型有条件地执行适当的代码,避免了部分专业化的需要。
以上是为什么我的函数无法使用'std::is_same”处理多个容器类型?的详细内容。更多信息请关注PHP中文网其他相关文章!