【问题标题】:Unpacking variadic tuples in c++17在 C++17 中解包可变参数元组
【发布时间】:2018-01-26 15:27:47
【问题描述】:

在 c++17(可能是 C++2a)中有什么比经典的 C++14 方法更好的解压可变参数元组std::index_sequence

还有什么比这更好的:

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

喜欢fold expressionstructured-bindings?有什么提示吗?我可以接受为什么我不能在这里使用这些提到的 C++17 功能的答案 - 但我更喜欢“解决方案”。

【问题讨论】:

  • 顺便说一句,std::ignore 分配的目的是什么?是记录意图吗?
  • @MassimilianoJanes 或多或少是的

标签: c++ variadic-templates c++17 structured-bindings fold-expression


【解决方案1】:

从 C++14 开始,我们有了通用 lambda,从 C++17 开始,我们有了折叠表达式,std::apply 有效地隐藏了通常的解包逻辑:

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

注意:为了您的信息,(无效)的事情只是为了避免任何自定义逗号运算符的作用......你永远不知道:)

【讨论】:

  • 不错,但仍然是 hack。赞成,因为 C++ 不允许直接语法不是你的错。
  • @bolov 是的,最hackish的是需要使用逗号运算符;我想知道为什么我们不能只 expr;...; ... 但我想这在语法方面会有问题
  • 可以将您的解决方案应用到我的示例中吗?我的意思是一些使用示例
  • @PiotrNycz 是的,只需将increment() 调用替换为上述调用,将some_tuple 替换为i 成员
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多