¿Cómo puedo hacer que std :: find_if y std :: map funcionen juntos usando alguna biblioteca de impulso?

Esta pregunta está inspirada enotro tem que plantea esta pregunta:

Busque el primer valor mayor que el valor especificado por el usuario desde un contenedor de mapas

que se puede resolver de varias maneras. Una solución típica de C ++ 03 define una función dedicada (o functor) y la pasa astd::find_if como tercer argumento.

En C ++ 11, se puede evitar definir unadedicad function (o functor), y en su lugar puede utilizarlambda como

auto it = std:: find_if(m.begin(), mp.end(), 
                    [n](const std::pair<std::string, int> & x) -> bool
                       { return x.second > n; }
                   );

cual esla respuesta aceptada.

Todavía estoy buscando una solución corta y genial. Si se tratara de un vector, entonces aprendí una solución genial que utilizaBoost.Phoenix y la solución se vuelve muy concisa ideone demo):

std::vector<int> v = ...;
auto it = std::find_if(v.begin(), v.end(), arg1 > 4);

Aquíarg1 es un objeto functor definido enboost::phoenix::arg_names espacio de nombres y la expresiónarg1>4 evalúa a otro functor que luego pasa astd::find_if.

Una prueba rápida es ideone),

std::cout<< (arg1 > 9)(v) << std::endl; //prints 0 if as v > 9 is false, else 1

//or store the functor first and then use it
const auto & f = arg1 > 9;
std::cout<<  f(v) << std::endl; //prints 0 if as v > 9 is false, else 1

Mi pregunta es, quiero resolver el problema del mapa, de manera similar. ¿Existe alguna solución? Algo como

auto it = std::find_if(m.begin(),mp.end(), (???).second > n); //m is std::map

O

auto it = std::find_if(m.begin(),mp.end(), at<1>(arg1) > n);  //m is std::map

Para que funcione, la expresiónat<1>(arg1) > 2 tiene que evaluar a un functor que tomaconst std::pair & como argumento. Mis instintos me dicen que el impulso tiene esta solución. : -)

Respuestas a la pregunta(1)

Su respuesta a la pregunta