Ho il seguente pezzo di codice (C++ 11):È possibile restituire un lambda variadico da un modello di funzione?
template <typename F,
typename FirstT,
typename... FIn>
auto min_on(F f, FirstT first, FIn... v) -> typename std::common_type<FirstT, FIn...>::type
{
using rettype = typename std::common_type<FirstT, FIn...>::type;
using f_rettype = decltype(f(first));
rettype result = first;
f_rettype result_trans = f(first);
f_rettype v_trans;
(void)std::initializer_list<int>{
((v_trans = f(v), v_trans < result_trans)
? (result = static_cast<rettype>(v), result_trans = v_trans, 0)
: 0)...};
return result;
}
che restituisce in sostanza la tesi result
che ha prodotto il valore minimo per l'espressione f(result)
. Questo può essere chiamato in questo modo:
auto mod7 = [](int x)
{
return x % 7;
};
auto minimum = min_on(mod7, 2, 8, 17, 5);
assert(minimum == 8); // since 8%7 = 1 -> minimum value for all arguments passed
Ora vorrei utilizzare questo in un modo 'curry' in modo che io possa avere un lambda variadic da min_on
e poi chiamare con argomenti (che io possa ricevere in seguito) , così:
auto mod7 = [](int x)
{
return x % 7;
};
auto f_min = min_on(mod7);
auto minimum = f_min(2, 8, 17, 5);
// or
auto minimum = min_on(mod7)(2, 8, 17, 5);
È possibile?
Richiede solo C++ 11? – Yakk
@Yakk sì, ma si possono citare anche le soluzioni C++ 14 – Patryk