如何使用模板元编程压缩向量

分享于2022年09月08日 c++ templates variadic-templates 问答
【问题标题】:How to zip vectors using template metaprogramming如何使用模板元编程压缩向量
【发布时间】:2022-08-01 23:45:10
【问题描述】:

我正在练习模板元编程,并想实现一个简单的微不足道的元功能。我想知道如何在自定义向量上实现 zip 功能。我的想法如下:

下面是这个自定义向量的 zip 操作的样子:

输入:

Vector<1, 2, 3>
Vector<2, 3, 4>
Vector<3, 4, 5>

输出:

Vector<6, 24, 60>

我相信我的 Vector 类应该声明为:

template
struct Vector;

zip 元函数应具有签名:

template
struct zip
{
    ///
}

我无法弄清楚如何通过模板元编程将恰好位于同一索引中的输入向量中的值相乘?

  • 我想你在这里使用术语 zip ,而你想要别的东西。从输入和输出来看,您似乎想要 o[0] = i0[0] * i1[0] * i2[0] 等。而术语 zip 通常是指产生 Vector<int[3]> 或类似名称 ( { {1,2,3} , {2,3,4}, {3,4,5} } )。

【解决方案1】:

您可以部分专门化 zip 以公开您传递的 Vector s 的模板参数。

template
struct zip;

template
struct zip, Vector, Tail...> {
    using type = typename zip, Tail...>::type;
};

template
struct zip {
    using type = T;
};

static_assert(std::is_same, 
                               Vector<1, 2, 3>, 
                               Vector<3, 6, 9>>::type, 
                               /* == */ Vector<6, 48, 162>>::value);

【讨论】:

  • 缺少 typename 之后就可以了: godbolt.org/z/hPoand6vY
  • 这是折叠表达式吗?
  • 依赖类型之前没有: using type = typename zip....::type
  • @MarekR 谢谢。 GCC 的主干用 C++20 编译代码,所以我什么也没想到。编辑了答案。
  • C++20 有新规则,在这种情况下会丢弃 typedef 。 Clang 尚未实现该功能,因此即使使用 C++20 也***提供 typename