Вот хорошая, краткая лямбда-выражения на основе сгиба в 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 относительно ясным и лаконичным способом.Чтобы быть точным, я хочу иметь возможность писать код, который вычисляет квадрат величины вектора для вектора некоторого известного числа измерений с синтаксисом вызова функции.Количество измерений может варьироваться произвольно.И точный числовой тип отдельных компонентов системы координат также может быть произвольным и, возможно, неоднородным.Но общий способ обработки C ++ 17-кратных выражений в C ++ 14 был бы идеальным.
#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);
}