参数包到参数包的映射

Parameter pack to parameter pack mapping

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

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]...) 所以我会保持原样。

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

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

Basically I want to create a parameter pack of the results from applying the [] to the pack elements.

你的意思如下?

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