如果你真的想弯腰向后使用倍的表达,你仍然可以做到这一点。您将需要一个辅助功能类:
#include <tuple>
#include <utility>
template<typename... Fs>
class product_of_fn
{
std::tuple<Fs...> fs;
public:
template<typename... FsFwd>
constexpr explicit product_of_fn(FsFwd &&... fs)
: fs{ std::forward<FsFwd>(fs)... }
{}
constexpr auto operator()(float x, float y) {
return impl(x, y, std::make_index_sequence<sizeof...(Fs)>{});
}
private:
template<std::size_t... Is>
constexpr auto impl(float x, float y, std::index_sequence<Is...>) {
return (... * std::get<Is>(fs)(x, y));
}
};
使用(使用@VittorioRomeo的例子)
template<typename... Fs>
constexpr auto product_of(Fs... fs) {
return product_of_fn<std::decay_t<Fs>...>{ std::forward<Fs>(fs)... };
}
template<int>
struct adder
{
constexpr auto operator()(float x, float y) { return x + y; }
};
int main()
{
auto f = product_of(adder<0>{}, adder<1>{});
static_assert(f(1, 2) == 3 * 3);
}
的想法是几乎完全一样维托里奥的,除非我们使用了std::tuple
这样我们就可以对于类型为final
的函数对象以及相同类型的多个函数,使用product_of
函数。
甲std::index_sequence
被用于重新获得一个参数包只是让我们可以做倍的表达。
只需转换维托里奥的解决方案工作,以及,但与告诫我提到(均未的Fs
可以是最终或相同):
#include <utility>
template<typename... Fs>
class product_of_fn : Fs...
{
public:
template<typename... FsFwd>
constexpr explicit product_of_fn(FsFwd &&... fs)
: Fs{ std::forward<FsFwd>(fs) }...
{}
constexpr auto operator()(float x, float y) {
return (... * static_cast<Fs &>(*this)(x, y));
}
};
折表达式是C++只是17。你在问如何替换fold表达式并在C++ 14中具有'constexpr''? –
此外你可能想'[=]','不[b]'... – Barry
@VittorioRomeo不,我想吨至保持倍的表达,但实现的C++ 14的感'constexpr'ness。 – 0xbadf00d