gpt4 book ai didi

c++ - 如何遍历 std::tuple 的元素?

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:05 25 4
gpt4 key购买 nike

如何迭代元组(使用 C++11)?我尝试了以下方法:

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

但这行不通:

Error 1: sorry, unimplemented: cannot expand ‘Listener ...’ into a fixed-length argument list.
Error 2: i cannot appear in a constant expression.

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

最佳答案

我有一个基于 Iterating over a Tuple 的答案:

#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);
}

int
main()
{
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 代表元组可能包含的每种类型具有适当重载的东西。如果您知道所有元组元素将共享一个公共(public)基类或类似的东西,那么这种方法效果最好。

关于c++ - 如何遍历 std::tuple 的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com