使用boost phoenix,如何使用starts_with调用find_if调用?

时间:2011-12-13 21:56:39

标签: c++ boost boost-phoenix

我正在尝试在结构向量中找到一个元素。以区分大小写的方式搜索时,代码有效。当我尝试将其增强为不区分大小写时,我遇到了两个问题。

  1. 简单地包括boost/algorithm/string.hpp打破了之前正在运行的VS2010版本。错误是“'boost :: phoenix :: bind':对重载函数的模糊调用”。在Xcode中构建正常。有什么方法可以消除绑定歧义?

  2. 我猜我在第二行(注释掉)的find_if行中输入了语法错误,添加了istarts_with调用。我从凤凰标题中得到错误,说“错误:没有名为'type'的类型”。假设问题#1可以修复,我应该如何纠正这一行?

  3. 谢谢!

    代码:

    #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 个答案:

答案 0 :(得分:2)

您需要两个绑定才能使其正常工作。首先定义:

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的定义可能是不必要的,但我找不到更换它的正确方法。