如何迭代 std::tuple 的元素?

新手上路,请多包涵

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

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

但这不起作用:

错误 1:抱歉,未实现:无法将 ‘Listener …’ 扩展为固定长度的参数列表。

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

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

原文由 1521237 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 613
2 个回答

Boost.Fusion 是一种可能性:

未经测试的例子:

 struct DoSomething
{
    template<typename T>
    void operator()(T& t) const
    {
        t.do_sth();
    }
};

tuple<....> t = ...;
boost::fusion::for_each(t, DoSomething());

原文由 Éric Malenfant 发布,翻译遵循 CC BY-SA 3.0 许可协议

template <typename F, typename T>
static constexpr size_t
foreach_in_tuple(std::tuple<T> & tuple, F && do_, size_t index_ = 0)
{
    do_(tuple, index_);
    return index_;
}

template <typename F, typename T, typename U, typename... Types>
static constexpr size_t
foreach_in_tuple(std::tuple<T,U,Types...> & tuple, F && do_, size_t index_ = 0)
{
    if(!do_(tuple, index_))
        return index_;
    auto & next_tuple = reinterpret_cast<std::tuple<U,Types...> &>(tuple);
    return foreach_in_tuple(next_tuple, std::forward<F>(do_), index_+1);
}

int main()
{
    using namespace std;
    auto tup = make_tuple(1, 2.3f, 'G', "hello");

    foreach_in_tuple(tup, [](auto & tuple, size_t i)
    {
        auto & value = std::get<0>(tuple);
        std::cout << i << " " << value << std::endl;
        // if(i >= 2) return false; // break;
        return true; // continue
    });
}

原文由 Defalt8 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题