如果你真的想彎腰向後使用倍的表達,你仍然可以做到這一點。您將需要一個輔助功能類:
#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