Используя boost phoenix, как я могу вызвать вызов find_if с помощью launch_with? - PullRequest
5 голосов
/ 14 декабря 2011

Я пытаюсь найти элемент в векторе структур. Код работает при поиске с учетом регистра. Когда я пытаюсь сделать его более чувствительным к регистру, я сталкиваюсь с двумя проблемами.

  1. Простое включение boost/algorithm/string.hpp нарушает ранее работающую сборку VS2010. Ошибка "boost :: phoenix :: bind ': неоднозначный вызов перегруженной функции". Строит ОК в Xcode. Любой способ устранить неоднозначность связывания?

  2. Полагаю, я неправильно понял синтаксис во второй (закомментированной) строке find_if, добавив вызов istarts_with. Я получаю ошибки от заголовков феникса, говорящих «ошибка: нет типа с именем« тип »». Предполагая, что проблема № 1 может быть исправлена, как мне исправить эту строку?

Спасибо!

Код:

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <boost/algorithm/string.hpp> // This include breaks VS2010!
#include <boost/phoenix/bind.hpp>
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/operator.hpp>
#include <boost/phoenix/stl/algorithm.hpp>
using namespace boost::phoenix;
using boost::phoenix::arg_names::arg1;
using boost::istarts_with;
using std::string;
using std::cout;

// Some simple struct I'll build a vector out of
struct Person
{
    string FirstName;
    string LastName;
    Person(string const& f, string const& l) : FirstName(f), LastName(l) {}
};

int main()
{
    // Vector to search
    std::vector<Person> people;
    std::vector<Person>::iterator dude;

    // Test data
    people.push_back(Person("Fred", "Smith"));

    // Works!
    dude = std::find_if(people.begin(), people.end(), bind(&Person::FirstName, arg1) == "Fred");
    // Won't build - how can I do this case-insensitively?
    //dude = std::find_if(people.begin(), people.end(), istarts_with(bind(&Person::FirstName, arg1), "Fred"));

    if (dude != people.end())
        cout << dude->LastName;
    else
        cout << "Not found";
    return 0;
}

1 Ответ

2 голосов
/ 14 декабря 2011

Для работы вам понадобятся две привязки.Сначала определите:

int istw(string a, string b) { return istarts_with(a,b); }

, а затем используйте следующее в качестве предиката для find_if:

bind(&istw,bind(&Person::FirstName, arg1),"fred")

Два комментария:

  1. Убедитесь, что выВы используете правильное bind, а именно: boost::phoenix::bind.
  2. Определение istw, вероятно, излишне, но я не смог найти правильный способ его замены.
...