[英]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.