以下は、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);
}