这是 C++17 中基于 lambda 的简洁、简洁的折叠表达式:
#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++14 中表达上述 C++17 代码的方法。准确地说,我希望能够编写代码,使用类似函数调用的语法计算某个已知维数的向量的向量幅度的平方。但是,维度的数量可以任意变化。并且坐标系的各个分量的精确数字类型也可能是任意的,并且可能是异构的。但是在 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);
}