Mam następujący fragment kodu (C++ 11):Czy można zwrócić lambdę variadic z szablonu funkcji?
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;
}
które zasadniczo zwraca argument result
że wytwarzany minimalną wartość wyrażenia f(result)
. Można to nazwać tak:
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
Teraz chciałbym użyć tego w „curry” sposób, aby można było uzyskać zmiennej liczbie argumentów lambda od min_on
a następnie wywołać go z argumentami (że mogę otrzymać później) , tak:
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);
Czy to możliwe?
Czy potrzebujesz tylko C++ 11? – Yakk
@Tak tak, ale możesz również wymienić rozwiązania C++ 14 – Patryk