Я бы сделал это:
C ++ 14
auto l = [](auto value, auto c1, auto c2, auto op)
{
return (op(value, c1) && op(value, c2));
};
l(1, 2, 3, [](int a, int b) { return a < b; });
C ++ 11
auto l = [](int value, int c1, int c2, bool(* op)(int, int))
{
return (op(value, c1) && op(value, c2));
};
l(1, 2, 3, [](int a, int b) { return a < b; });
Ну, вы также можете сделать это:
Я не согласен, действительно ли я рекомендую это. С одной стороны, это макро-гадость, с другой стороны это выглядит довольно невинно, просто и не требует объяснений
C ++ 14
auto l = [](auto value, auto c1, auto c2, auto op)
{
return (op(value, c1) && op(value, c2));
};
l(1, 2, 3, OPERATOR(<));
l(1, 2, 3, OPERATOR(<=));
l(1, 2, 3, OPERATOR(>));
l(1, 2, 3, OPERATOR(>=));
l(1, 2, 3, OPERATOR(==));
l(1, 2, 3, OPERATOR(!=));
с
#define OPERATOR(op) [] (const auto& a, const auto& b) { return a op b; }
C ++ 11
auto l = [](int value, int c1, int c2, Op_t<int, int, bool> op)
{
return (op(value, c1) && op(value, c2));
};
l(1, 2, 3, OPERATOR(int, int, <));
l(1, 2, 3, OPERATOR(int, int, <=));
l(1, 2, 3, OPERATOR(int, int, >));
l(1, 2, 3, OPERATOR(int, int, >=));
l(1, 2, 3, OPERATOR(int, int, ==));
l(1, 2, 3, OPERATOR(int, int, !=));
с
#define OPERATOR(T1, T2, op) [] (const T1& a, const T2& b) { return a op b; }
template <class T1, class T2, class R>
using Op_t = auto (*) (const T1&, const T2&) -> R;