C++ c++;17倍表达点积

C++ c++;17倍表达点积,c++,c++17,fold-expression,C++,C++17,Fold Expression,我想用折叠表达式替换旧的元递归函数,下面的元函数是点积 如何替换以下代码以折叠表达式 constexpr static auto result = Head1 * Head2 + DotProduct<List<Tail1...>, List<Tail2...>>::result; constexpr静态自动结果=Head1*Head2+DotProduct::result; 使用类似这样的伪代码 constexpr static auto result

我想用折叠表达式替换旧的元递归函数,下面的元函数是点积

如何替换以下代码以折叠表达式

constexpr static auto result = Head1 * Head2 + DotProduct<List<Tail1...>, List<Tail2...>>::result;
constexpr静态自动结果=Head1*Head2+DotProduct::result;
使用类似这样的伪代码

constexpr static auto result = Head1 * Head2 + (Tail1... * Tail2...)



template <typename List1, typename List2>
  struct DotProduct;

  template <T Head1, T Head2, T... Tail1, T... Tail2>
  struct DotProduct< List<Head1, Tail1...>, List<Head2, Tail2...> >
  {
    constexpr static auto result = Head1 * Head2 + 
    //constexpr static auto result = Head1 * Head2 + DotProduct<List<Tail1...>, List<Tail2...>>::result;
  };

  template <T Head1, T Head2>
  struct DotProduct< List<Head1>, List<Head2>>
  {
    constexpr static auto result = Head1 * Head2;
  };

  template <T... Head1, T... Head2>
  struct DotProduct< List<Head1...>, List<Head2...>>
  {
    //return result as the default constructor of T (most cases : 0)
    constexpr static auto result = T();
    /* to check if both lists are the same size. This will cause a compile
    failure if the 2 lists are of unequal size. */
    using CheckIfSameSize = 
      typename std::enable_if<sizeof...(Head1) == sizeof...(Head2)>::type;
  };
constexpr静态自动结果=Head1*Head2+(Tail1…*Tail2…)
模板
结构点积;
模板
结构点产品<列表,列表>
{
constexpr静态自动结果=Head1*Head2+
//constexpr静态自动结果=Head1*Head2+DotProduct::result;
};
模板
结构点产品<列表,列表>
{
constexpr静态自动结果=Head1*Head2;
};
模板
结构点产品<列表,列表>
{
//将结果作为T的默认构造函数返回(大多数情况下为0)
constexpr静态自动结果=T();
/*检查两个列表是否大小相同。这将导致编译失败
如果两个列表大小不相等,则失败*/
使用CheckIfSameSize=
typename std::enable_if::type;
};
清洁版

 template <typename List1, typename List2>
  struct DotProduct;

  template <T ...Head1, T ...Head2>
  struct DotProduct< List<Head1...>, List<Head2...> >
  {
    if constexpr(sizeof...(Head1) == sizeof...(Head2))
      constexpr static auto result = ((Head1 * Head2) + ...);
  };
模板
结构点积;
模板
结构点产品<列表,列表>
{
如果constexpr(sizeof…(Head1)=sizeof…(Head2))
constexpr静态自动结果=((Head1*Head2)+…);
};

这有点琐碎:

template <T ... A, T ... B>
struct DotProduct<List<A...>, List<Head2, B...>>
{
    constexpr static auto result = ((A * B) + ...);
};
模板
结构点积
{
constexpr静态自动结果=((A*B)+…);
};

感谢现在看起来更干净、更简单,以防止不同大小的列表可以使用,如果constexpr检查相同,然后执行constexpr static auto result=((A*B)+…)@用户3770234您可以
静态断言(sizeof…(A)==sizeof…(B))