[英]c++17 fold expression dot product simpfily
我想用fold表達式替換舊的meta遞歸函數,下面的meta函數是點積
如何替換以下代碼以折疊表達式?
constexpr static auto result = Head1 * Head2 + DotProduct<List<Tail1...>, List<Tail2...>>::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;
};
清潔版
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) + ...);
};
這有點瑣碎:
template <T ... A, T ... B>
struct DotProduct<List<A...>, List<Head2, B...>>
{
constexpr static auto result = ((A * B) + ...);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.