这是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代码的方法。确切地说,我希望能够编写类似函数调用语法的代码,该代码针对某个已知维数的 vector 计算 vector 幅度的平方。尺寸的数量可以任意变化。坐标系统各个组成部分的精确数字类型也可以是任意的,也可能是异类的。但是,在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);
}
最佳答案
#include <utility>
#include <functional>
template<class F, class A0>
auto fold(F&&, A0&& a0) {
return std::forward<A0>(a0);
}
template<class F, class A0, class...As>
auto fold(F&& f, A0&&a0, As&&...as) {
return f(std::forward<A0>(a0), fold(f, std::forward<As>(as)...));
}
auto sum_squares=[](auto&&...args) {
return fold(std::plus<>{}, (args * args)... );
};
关于c++ - 在C++ 14中,此C++ 17折叠表达式的一个好的替代方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51005897/