我想将参数包重新映射到其他类型的参数包。
更确切地说,我有一个功能:

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


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

编辑:

似乎我误以为是op(pack[i]...)引起了问题,而实际上这是合法的C ++构造(我认为这是非法的)。所以看来我的static_for循环实际上出了点问题。我的问题本来是关于op(pack[i]...)的,所以我会保持原样。

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

标准中是否有提及此包扩展行为的地方-即可以在顶部应用功能的事实?

最佳答案

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

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

关于c++ - 参数包到参数包的映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58468421/

10-09 19:55