如何迭代std:tuple的元素?

如何迭代std:tuple的元素?

我如何迭代一个元组(使用C+11)?我尝试了以下几点:

for(int i=0; i<std::tuple_size<T...>::value; ++i) 
  std::get<i>(my_tuple).do_sth();

但这是行不通的:

错误1:对不起,未实现:无法展开“侦听器.”到一个固定长度的参数列表中。
错误2:我不能出现在常量表达式中。

那么,如何正确地迭代元组的元素呢?


慕的地10843
浏览 782回答 3
3回答

慕姐8265434

我有一个基于迭代元组:#include&nbsp;<tuple>#include&nbsp;<utility>&nbsp;#include&nbsp;<iostream>template<std::size_t&nbsp;I&nbsp;=&nbsp;0,&nbsp;typename...&nbsp;Tp>inline&nbsp;typename&nbsp;std: :enable_if<I&nbsp;==&nbsp;sizeof...(Tp),&nbsp;void>::type &nbsp;&nbsp;print(std::tuple<Tp...>&&nbsp;t) &nbsp;&nbsp;{&nbsp;}template<std::size_t&nbsp;I&nbsp;=&nbsp;0,&nbsp;typename...&nbsp;Tp>inline&nbsp;typename&nbsp;std::enable_if<I&nbsp;<&nbsp;sizeof...(Tp),&nbsp;void>::type &nbsp;&nbsp;print(std::tuple<Tp...>&&nbsp;t) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;std::get<I>(t)&nbsp;<<&nbsp;std::endl; &nbsp;&nbsp;&nbsp;&nbsp;print<I&nbsp;+&nbsp;1,&nbsp;Tp...>(t); &nbsp;&nbsp;}intmain(){ &nbsp;&nbsp;typedef&nbsp;std::tuple<int,&nbsp;float,&nbsp;double>&nbsp;T; &nbsp;&nbsp; &nbsp;&nbsp;T&nbsp;t&nbsp;=&nbsp;std::make_tuple(2,&nbsp;3.14159F,&nbsp;2345.678); &nbsp;&nbsp;print(t);}通常的想法是使用编译时递归。事实上,这个想法被用来制作一个类型安全的printf,正如在最初的元组论文中所指出的那样。这可以很容易地推广到for_each元组:#include&nbsp;<tuple>#include&nbsp;<utility>&nbsp;template<std::size_t&nbsp;I&nbsp;=&nbsp;0,&nbsp;typename&nbsp;FuncT,&nbsp;typename...&nbsp;Tp>inline&nbsp;typename&nbsp;std: :enable_if<I&nbsp;==&nbsp;sizeof...(Tp),&nbsp;void>::type &nbsp;&nbsp;for_each(std::tuple<Tp...>&nbsp;&,&nbsp;FuncT)&nbsp;//&nbsp;Unused&nbsp;arguments&nbsp;are&nbsp;given&nbsp;no&nbsp;names. &nbsp;&nbsp;{&nbsp;}template<std::size_t&nbsp;I&nbsp;=&nbsp;0,&nbsp;typename&nbsp;FuncT,&nbsp;typename...&nbsp;Tp>inline&nbsp;typename&nbsp;std::enable_if<I&nbsp;<&nbsp;sizeof...(Tp),&nbsp;void>::type &nbsp;&nbsp;for_each(std::tuple<Tp...>&&nbsp;t,&nbsp;FuncT&nbsp;f) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;f(std::get<I>(t)); &nbsp;&nbsp;&nbsp;&nbsp;for_each<I&nbsp;+&nbsp;1,&nbsp;FuncT,&nbsp;Tp...>(t,&nbsp;f); &nbsp;&nbsp;}虽然这需要一些努力FuncT对元组可能包含的每个类型表示具有适当重载的内容。如果您知道所有元组元素都将共享一个公共基类或类似的东西,这是最好的。
打开App,查看更多内容
随时随地看视频慕课网APP