首页 > 后端开发 > C++ > 正文

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

Mary-Kate Olsen
发布: 2024-11-01 14:09:02
原创
170 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!