Como posso fazer com que std :: find_if e std :: map funcionem juntos usando uma biblioteca de impulso?

Esta questão é inspirada emoutro assunt que coloca esta pergunta:

Encontre o primeiro valor maior que o valor especificado pelo usuário em um contêiner de mapa

que pode ser resolvido de várias maneiras. Uma solução típica do C ++ 03 define uma função dedicada (ou functor) e a passa parastd::find_if como terceiro argumento.

No C ++ 11, pode-se evitar definir umdedicad (ou functor) e, em vez disso, pode usarlambda Como

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

qual éa resposta aceita.

Ainda estou procurando uma solução curta e legal. Se fosse um vetor, acabei de aprender uma solução legal que utilizaBoost.Phoenix e a solução se torna muito concisa ideone demo):

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

Aquiarg1 é um objeto functor definido emboost::phoenix::arg_names namespace e a expressãoarg1>4 avalia para outro functor que é passado parastd::find_if.

Um teste rápido é 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

Minha pergunta é: eu quero resolver o problema do mapa, de maneira semelhante. Existe alguma solução desse tipo? Algo como

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

Ou

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

Para que funcione, a expressãoat<1>(arg1) > 2 tem que avaliar para um functor que levaconst std::pair & como argumento. Meus instintos me dizem que o impulso tem essa solução. : -)

questionAnswers(1)

yourAnswerToTheQuestion