为了账号安全,请及时绑定邮箱和手机立即绑定

如何迭代std:tuple的元素?

如何迭代std:tuple的元素?

C++ C
慕的地10843 2019-06-16 14:27:54
如何迭代std:tuple的元素?我如何迭代一个元组(使用C+11)?我尝试了以下几点:for(int i=0; i<std::tuple_size<T...>::value; ++i)    std::get<i>(my_tuple).do_sth();但这是行不通的:错误1:对不起,未实现:无法展开“侦听器.”到一个固定长度的参数列表中。错误2:我不能出现在常量表达式中。那么,如何正确地迭代元组的元素呢?
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

我有一个基于迭代元组:

#include <tuple>#include <utility> #include <iostream>template<std::size_t I = 0, typename... Tp>inline typename std:
:enable_if<I == sizeof...(Tp), void>::type
  print(std::tuple<Tp...>& t)
  { }template<std::size_t I = 0, typename... Tp>inline typename std::enable_if<I < sizeof...(Tp), void>::type
  print(std::tuple<Tp...>& t)
  {
    std::cout << std::get<I>(t) << std::endl;
    print<I + 1, Tp...>(t);
  }intmain(){
  typedef std::tuple<int, float, double> T;
  
  T t = std::make_tuple(2, 3.14159F, 2345.678);

  print(t);}

通常的想法是使用编译时递归。事实上,这个想法被用来制作一个类型安全的printf,正如在最初的元组论文中所指出的那样。

这可以很容易地推广到for_each元组:

#include <tuple>#include <utility> template<std::size_t I = 0, typename FuncT, typename... Tp>inline typename std:
:enable_if<I == sizeof...(Tp), void>::type
  for_each(std::tuple<Tp...> &, FuncT) // Unused arguments are given no names.
  { }template<std::size_t I = 0, typename FuncT, typename... Tp>inline typename std::enable_if<I < sizeof...(Tp), void>::type
  for_each(std::tuple<Tp...>& t, FuncT f)
  {
    f(std::get<I>(t));
    for_each<I + 1, FuncT, Tp...>(t, f);
  }

虽然这需要一些努力FuncT对元组可能包含的每个类型表示具有适当重载的内容。如果您知道所有元组元素都将共享一个公共基类或类似的东西,这是最好的。



查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 781 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信