【发布时间】:2018-06-23 23:45:29
【问题描述】:
这是一个漂亮、简洁的 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);
}
【问题讨论】:
-
它应该做什么?
-
@NeilButterworth - 我希望能够用简洁的函数调用类语法来表达计算任意数量的类数字对象的平方和。每次我需要这个总和时,我都知道在那个特定时间我将处理多少个数字。我希望编译器为此生成尽可能高效的代码。 :-)
-
@Omnifarious 我认为您的问题的正确位置是:codereview.stackexchange.com :)
-
@eyllanesc - 是的,我想知道那不是一个更好的地方。 :-/
-
您可以将参数分解成一个共同类型的数组,然后使用常规循环来计算结果。
标签: c++ templates c++14 variadic-templates fold-expression