gpt4 book ai didi

c++ - 具有折叠表达式的函数的乘积

转载 作者:行者123 更新时间:2023-11-30 02:26:09 26 4
gpt4 key购买 nike

我想编写一个函数,它采用 float(float, float) 形式的任意数量的函数,并生成一个可调用对象(例如 lambda 表达式),该对象表示乘积(在这些函数的数学意义。

例如,我们可以通过以下方式做到这一点:

template<typename... BinaryFunctions>
auto product_of(BinaryFunctions... fs) {
return [=](float x, float y) { return (... * fs(x, y)); };
}

但是,在 C++17 之前,即使 fs 是,返回的 lambda 也不是 constexpr。所以,问题是:我想保留折叠表达式,但如何修改 product_of 以便返回的可调用对象是 C++ 意义上的 constexpr 14?

最佳答案

如果你能使用折叠表达式,说明你的编译器支持C++17。如果您的编译器支持 C++17,lambda 表达式 会在可能的情况下隐式地 constexpr。我假设您需要一个 C++14 解决方案。


请记住,lambda 表达式 只是具有重载 operator()函数对象 的语法糖。

这是一个使用 initializer_list 进行可变参数扩展的 C++14 解决方案。

template <typename... TFs>
struct product_of_fn : TFs...
{
template <typename... TFFwds>
constexpr product_of_fn(TFFwds&&... fs) : TFs(std::forward<TFFwds>(fs))... { }

constexpr auto operator()(float x, float y)
{
std::initializer_list<float> results{static_cast<TFs&>(*this)(x, y)...};
float acc = 1;
for(auto x : results) acc *= x;
return acc;
}
};

用法:

template<int>
struct adder
{
constexpr auto operator()(float x, float y){ return x + y; }
};

template<typename... TFs>
constexpr auto product_of(TFs&&... fs) {
return product_of_fn<std::decay_t<TFs>...>(std::forward<TFs>(fs)...);
}

int main()
{
auto f = product_of(adder<0>{}, adder<1>{});

static_assert(f(1, 2) == 3 * 3);
}

live example on wandbox

关于c++ - 具有折叠表达式的函数的乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43242923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com