6

以下は、C++17 のラムダ式に基づいた簡潔な折り畳み式です。

#include <cstdint>

using ::std::uint64_t;

constexpr auto sumsquares = [](auto... n) { return ((n * n) + ...); };

// I want this to work.
uint64_t foo(uint64_t x, uint64_t y, uint64_t z)
{
    return sumsquares(x, y, z);
}
// And this too
double bar(uint64_t x, double y)
{
    return sumsquares(x, y);
}

C++14 で同様のことを行うために書いたこのコードがありますが、本来よりもはるかに冗長で紛らわしいようです。上記の C++17 コードを C++14 で比較的明確かつ簡潔に表現する方法を探しています。正確には、関数呼び出しのような構文を使用して、既知の次元数のベクトルのベクトルの大きさの 2 乗を計算するコードを記述できるようにしたいと考えています。ただし、次元数は任意に変更できます。また、座標系の個々のコンポーネントの正確な数値型も任意であり、場合によっては異質である可能性があります。しかし、C++14 で C++17 の折り畳み式を処理する一般的な方法が理想的です。

#include <cstdint>
#include <utility> 

using ::std::uint64_t;

namespace {
    static constexpr struct {
        template <typename T>
        auto operator()(T && n) const
        {
           return n*n;
        }
        template <typename T, typename... S>
        auto operator()(T && n, S && ... s) const
        {
            return (n * n) + (*this)(::std::forward<S>(s)...);
        }
    } sumsquares;
}

// I want this to work.
uint64_t foo(uint64_t x, uint64_t y, uint64_t z)
{
    return sumsquares(x, y, z);
}
// And this too
double bar(uint64_t x, double y)
{
    return sumsquares(x, y);
}
4

3 に答える 3