Во-первых, вы не можете принять auto
параметры функции еще.Это нестандартный C ++.Также эта вещь typedef struct
является C-ism.В C ++ просто:
struct thing_t {
double A;
double B;
};
Теперь поговорим об обобщениях.convert
нужно знать о его аргументе?Может быть, это сама функция высшего порядка:
template <typename F, typename G>
auto convert(F f, G g) {
return [=](auto const& x) { return f(x) / g(x); }
}
А затем get_A
и get_B
просто возвращают членов.У нас уже есть синтаксис для этого: указатели на данные элементов (к сожалению, они не могут быть вызваны напрямую, поэтому вам нужно std::mem_fn
):
double f1(const thing_t& t) {
return convert(std::mem_fn(&thing_t::A), std::mem_fn(&thing_t::B))(t);
}
C ++ 17 вводит std::invoke
, чтобы вы могли сделать свою служебную функцию более удобной для пользователя.Это просто реализуемо в C ++ 14, но оно позволит вам написать:
template <typename F, typename G>
auto convert(F f, G g) {
return [=](auto const& x) { return std::invoke(f, x) / std::invoke(g, x); };
}
double f1(const thing_t& t) {
return convert(&thing_t::A, &thing_t::B)(t);
}
double f2(const thing_t& t) {
return convert(&thing_t::B, &thing_t::A)(t);
}
Что вы думаете об этом?