参数包到参数包的映射
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);
我想将参数包重新映射到不同类型的参数包。 更准确地说,我有一个函数:
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);