首页 > 解决方案 > 使用元函数的多个向量的向量积

问题描述

给定一个向量,如:

  template<int... elements>
  struct vec;

如何创建一个可以将所有提供的向量逐个元素相乘的元函数。例如

   template<typename ...AllVecs>
    struct multiVecs
   {
     using type = .... 
   }

其中 type 将逐个元素地执行所有产品。例如给定三个vecs:

   multiVecs< vec<0,1,2>, vec<1,2,3>, vec<2,3,4> >

我应该得到一个vec<0*1*2, 1*2*3, 2*3*4>

标签: c++c++14metaprogrammingtemplate-meta-programming

解决方案


让我们从两个向量积开始,然后从那里开始。

template <typename lhs, typename rhs>
struct multiplies;

template <int... lhs, int... rhs>
struct multiplies<vec<lhs...>, vec<rhs...>> {
    static_assert(sizeof...(lhs) == sizeof...(rhs), "Vector arity mismatch");
    using type = vec<(lhs * rhs)...>
};

template <typename lhs, typename rhs>
using multiplies_t = typename multiplies<lhs, rhs>::type;

这很好用,所以现在我们把它折叠起来。

不幸的是,C++14 没有折叠表达式,所以我们必须手动完成。

template <typename...>
struct multiVecs;

template <typename... Ts>
using multiVecs_t = typename multiVecs<Ts...>::type;

template <typename result>
struct multiVecs<result> {
    using type = result;
};

template <typename first, typename second, typename... rest>
struct multiVecs<first, second, rest...> {
    using type = multiVecs_t<multiplies<first, second>, rest...>;
};

这也不错


推荐阅读