首页  >  文章  >  后端开发  >  当尝试在函数中处理不同的容器类型时,为什么 std::is_same 会失败?

当尝试在函数中处理不同的容器类型时,为什么 std::is_same 会失败?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 14:09:02171浏览

Why does std::is_same fail when trying to process different container types in a function?

使用 std::is_same:为什么函数无法处理不同的容器类型

为了创建一个能够打印堆栈和队列的多功能函数,开发人员遇到编译错误。尽管使用 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&amp; operator()(const std::stack<T>&amp; s) const { return s.top(); }
};

template <typename T>
struct element_accessor<std::queue<T>> {
   const T&amp; operator()(const std::queue<T>&amp; q) const { return q.front(); }
};

template<typename Cont>
void print_container(Cont&amp; 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>&amp; 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn