首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何遍历std::tuple的元素?

如何遍历std::tuple的元素?
EN

Stack Overflow用户
提问于 2009-07-29 05:57:23
回答 20查看 102.4K关注 0票数 137

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

代码语言:javascript
复制
for(int i=0; i<std::tuple_size<T...>::value; ++i) 
  std::get<i>(my_tuple).do_sth();

但这不起作用:

错误1:对不起,未实现:无法展开‘Listener...’转换为固定长度的参数列表。

错误2: I不能出现在常量表达式中。

那么,如何正确地遍历元组的元素呢?

EN

Stack Overflow用户

发布于 2020-05-31 18:25:36

扩展@Stypox answer,我们可以使他们的解决方案更通用(C++17更高)。通过添加一个可调用的函数参数:

代码语言:javascript
复制
template<size_t I = 0, typename... Tp, typename F>
void for_each_apply(std::tuple<Tp...>& t, F &&f) {
    f(std::get<I>(t));
    if constexpr(I+1 != sizeof...(Tp)) {
        for_each_apply<I+1>(t, std::forward<F>(f));
    }
}

然后,我们需要一个访问每种类型的策略。

让我们从一些帮助器开始(前两个取自cppreference):

代码语言:javascript
复制
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
template<class ... Ts> struct variant_ref { using type = std::variant<std::reference_wrapper<Ts>...>; };

variant_ref用于允许修改元组的状态。

用法:

代码语言:javascript
复制
std::tuple<Foo, Bar, Foo> tuples;

for_each_apply(tuples,
               [](variant_ref<Foo, Bar>::type &&v) {
                   std::visit(overloaded {
                       [](Foo &arg) { arg.foo(); },
                       [](Bar const &arg) { arg.bar(); },
                   }, v);
               });

结果:

代码语言:javascript
复制
Foo0
Bar
Foo0
Foo1
Bar
Foo1

为了完整起见,这里是我的Bar & Foo

代码语言:javascript
复制
struct Foo {
    void foo() {std::cout << "Foo" << i++ << std::endl;}
    int i = 0;
};
struct Bar {
    void bar() const {std::cout << "Bar" << std::endl;}
};
票数 1
EN
查看全部 20 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1198260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档