【发布时间】:2019-10-19 22:08:42
【问题描述】:
我想将参数包重新映射到不同类型的参数包。 更确切地说,我有一个功能:
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
标准中是否有提到这种包扩展行为的地方 - 即功能可以应用在顶部的事实?
【问题讨论】:
-
您可能应该包含
static_for的定义,并说明如何调用该函数,以及使minimal reproducible example 无效的原因。 -
@super 我没有包含 static_for 因为它与示例有些无关。我也可以打电话给
op(pack[i]...)。问题是具体调用op(pack[i]...),一般是调用op(pack...),但是我想通过对当前参数包应用运算符[]来得到一个参数包。 -
那么
type_pack是参数包的参数包吗? -
你为什么要关心
Function的类型呢?只需从传入的内容中推断出来即可。 -
但是……你能做到吗?
op(pack[0]...);将使用包中每个参数的第一个元素调用 op。
标签: c++ templates variadic-templates