首页 > 后端开发 > C++ > 为什么我的函数无法使用'std::is_same”处理多个容器类型?

为什么我的函数无法使用'std::is_same”处理多个容器类型?

Linda Hamilton
发布: 2024-11-01 07:23:30
原创
451 人浏览过

Why Can't My Function Handle Multiple Container Types Using `std::is_same`?

为什么你的函数无法使用 std::is_same 处理多个容器类型

你的目的是创建一个通用函数 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板