繁体   English   中英

参数包到参数包的映射

[英]Parameter pack to parameter pack mapping

我想将参数包重新映射到不同类型的参数包。 更准确地说,我有一个 function:

template<typename ...type_pack, typename Function = void(type_pack&&...)>
        constexpr decltype(auto) zip(Function&& op, type_pack&&... pack)
        {
            static_for<0, N_lhs>([&](auto i)
                {
                    op(pack[i]...);
                });
            return;
        }

基本上我想通过将[]应用于包元素来创建结果的参数包。 注意这里的i是一个整数常量,而 static_for 是编译时,你可以假设[]constexpr 我对op没有太多控制权,因此它需要一个参数包而不是元组。

编辑:

似乎我误解了op(pack[i]...)导致了这个问题,而实际上这是一个合法的 C++ 构造(我认为它是非法的)。 所以看起来我的 static_for 循环实际上有问题。 我的问题最初是关于op(pack[i]...)所以我会保持原样。

我准备了一个更通用的示例,不使用[]而是使用不同的任意 function 只是为了进行健全性检查: https://godbolt.org/z/h8Hbbt

标准中是否有提到这种包扩展行为的地方 - 即可以在顶部应用函数的事实?

基本上我想通过将[]应用于包元素来创建结果的参数包。

你的意思如下吗?

template <typename ... type_pack,
          typename Function = void(decltype(std::declval<type_pack>()[0])...)>
constexpr decltype(auto) zip(Function&& op, type_pack&&... pack)
 {
   /* ... */
 }

如果您想要一个经过测试的答案,请准备一个最小但完整的示例(主要是static_for )。

参数包可以根据模式进行扩展。

template <typename... T>
void test(T... t) {
    (std::cout << ... << static_cast<int>(t));
}

在这里,它被扩展为折叠表达式,但它在常规包扩展中的工作方式相同。 这里的模式是static_cast<int>(t) ,它将扩展到

std::cout << static_cast<int>(t1) << static_cast<int>(t2) << ... << static_cast<int>(tN);

暂无
暂无

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

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