通用容器打印的 std::is_same:失败原因及解决方案
您在尝试编写通用函数时遇到问题打印堆栈和队列容器。该函数最初包含一个条件语句来确定容器的类型(堆栈或队列)并相应地访问其元素。然而,由于两种容器类型之间的成员函数不同,这种方法会导致编译错误。
理解问题:
编译错误源于以下事实if-else 语句的分支尝试访问堆栈类型上的 front() 和队列类型上的 top()。这些访问器在各自的类型上不可用,导致编译器抱怨。 C 具有强类型性,要求为特定类型提供其支持的相应成员函数。
解决问题:
要解决此问题,我们需要一种可以区分容器类型的解决方案,同时仍然提供对其特定成员函数的访问。这里有两种可能的解决方案:
1。使用访问器进行部分专业化:
一种方法是使用部分模板专业化并为每个容器类型定义一个访问器函数。此访问器函数将根据需要检索顶部或前面的元素。
<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); // call the accessor function std::cout << elem << '\n'; cont.pop(); } }
2. if constexpr with C 17:
如果您的开发环境支持 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>
两种解决方案都允许您编写可以打印堆栈和队列容器的通用函数,从而在 DFS 和 BFS 等搜索算法之间有效共享代码。
以上是为什么打印通用容器时 `std::is_same` 失败?的详细内容。更多信息请关注PHP中文网其他相关文章!