c++ - 使用元函数的多个向量的向量积
问题描述
给定一个向量,如:
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>
解决方案
让我们从两个向量积开始,然后从那里开始。
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...>;
};
推荐阅读
- c# - 使用 SciChart.WPF 显示相同的夏令时时间
- javascript - React Redux - 不变量失败:在调度中检测到状态突变
- spring - 我可以将 application.properties 文件添加到 Spring Boot 项目吗?
- filter - Powerbi groupby 过滤器,用于在包含特定值时看不到数据
- android - Junit 4 在 kotlin 中测试内部类
- flutter - 颤动中可调整大小的拼贴视图
- mysql - MySql:如何使用多个枢轴连接这两个表
- r - 如何从R中的数据集中删除浮动值
- javascript - 使用数组长度创建重复对象
- sql - Sql - 使用连接从大表(100M+)中获取记录时查询慢,提示?