在C++17中展开可变元组

9
有没有比经典的C++14使用std::index_sequence解包可变元组更好的方法,例如C++17(或者C++2a)?
有没有比下面这种方式更好的方法:
template <typename ...I>
class MultiIterator
{
public:
    MultiIterator(I const& ...i)
        : i(i...)
    {}

    MultiIterator& operator ++()
    {
        increment(std::index_sequence_for<I...>{});
        return *this;
    }


private:
    template <std::size_t ...C>
    void increment(std::index_sequence<C...>)
    {
        std::ignore = std::make_tuple(++std::get<C>(i)...);
    }

    std::tuple<I...> i;
};

喜欢折叠表达式结构化绑定吗?有什么提示吗?我可以接受为什么我不能在这里使用这些提到的C++17特性的答案 - 但我更喜欢“解决方案”。

顺便问一下,std::ignore 赋值的目的是什么?是为了记录意图吗? - Massimiliano Janes
1
@MassimilianoJanes 多多少少是的。 - PiotrNycz
1个回答

16

自从C++14以来,我们有了通用lambda,在C++17中我们有了fold表达式和std::apply有效地隐藏了常规的解包逻辑:

std::apply( [](auto&... i){ ((void)++i,...); }, some_tuple );

注: 供您参考,(void)这个东西只是为了避免任何自定义逗号运算符生效...你永远不知道:)



2
不错,但仍然是一种hack。点赞是因为这不是你的错,C++不允许直接语法。 - bolov
1
@bolov 是的,最不正规的事情就是需要使用逗号运算符;我想知道为什么我们不能只用 expr;...; ... 但我猜这可能会在语法上出现问题。 - Massimiliano Janes
你能将你的解决方案应用到我的增量示例中吗?我的意思是提供一些使用示例。 - PiotrNycz
@PiotrNycz 是的,只需用上述代码替换increment()调用,将some_tuple替换为i成员即可。 - Massimiliano Janes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接