繁体   English   中英

如何以“解压缩”的方式扩展参数包模式?

[英]How to expand parameter pack pattern in an “unzipping” manner?

假设我有一个可变参数 function, foo

template <typename... Args>
void foo(Args... args)
{
    // some work
}

我想要一个神奇的 function, bar ,它通过以下方式将其 arguments 转发到foo

说如果我打电话

bar(x, y, z);

它的效果与

foo(x.begin(), x.end(), y.begin(), y.end(), z.begin(), z.end());

如何实现这样的bar()

template <typename... Args>
void bar(Args... args)
{
    // what should I put here?
    // foo( (args.begin(), args.end()) ... );  // doesn't work 
}

如果您可以使用 C++17,请应用std::apply

template<class ...  Conts>
void bar(Conts&& ... c) {
    auto t = std::make_tuple( std::make_tuple(c.begin(),c.end())... );
    // tuple< tuple<C1.begin,C1.end>, tuple<C2.begin,C2.end>, ... >    [1]
    std::apply( [](auto&&... tuples){
            auto oneTuple = std::tuple_cat(std::forward<decltype(tuples)>(tuples)...);
            // tuple< C1.begin(), C1.end(), C2.begin(), C2.end(), ...>   [2]
            std::apply([](auto&&... its){
                foo(std::forward<decltype(its)>(its)...); /// all iterators begin/end    [3]
            }, oneTuple);
        }, t);
}
  1. 为所有条目创建 tuple tuple<begin,end>的元组
  2. 使用apply获取在第一步中创建的所有元组,并通过连接从它们中创建一个 - 使用tuple_cat
  3. 再次使用apply从第二步创建的元组中提取所有迭代器,将它们全部传递给foo

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM