【问题标题】:Parameter pack to parameter pack mapping参数包到参数包的映射
【发布时间】: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


【解决方案1】:

基本上我想创建一个参数包,将[] 应用于包元素。

你的意思是这样的吗?

template <typename ... type_pack,
          typename Function = void(decltype(std::declval<type_pack>()[0])...)>
constexpr decltype(auto) zip(Function&& op, type_pack&&... pack)
 {
   /* ... */
 }

如果您想要一个经过测试的答案,请准备一个最小但完整的示例(主要是static_for)。

【讨论】:

  • 是的,我相信我的定义是错误的。这就是主要思想,将pack... 转换为pack[i]...,或更一般地,将pack... 转换为g(pack)...,其中g 是一个constexpr 函数。这个问题与static_for 不太相关,我可能不应该把它放在首位。 op(pack[0]...) 在 main 函数中也一样好。
  • 您的回答实际上解决了我遇到的另一个问题 - 关于如何声明函数(我最初甚至不知道我遇到的问题)。
  • @lightxbulb - “你的回答实际上解决了我遇到的另一个问题” - 总比没有好:-)
  • 当然,它很有用。
【解决方案2】:

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

template <typename... T>
void test(T... t) {
    (std::cout << ... << static_cast<int>(t));
}

在这里它被扩展为折叠表达式,但它在常规包扩展中的工作方式相同。这里的模式是static_cast&lt;int&gt;(t),它将扩展为

std::cout << static_cast<int>(t1) << static_cast<int>(t2) << ... << static_cast<int>(tN);

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2012-02-01
    • 2018-09-20
    相关资源
    最近更新 更多