gpt4 book ai didi

c++ - 使用 boost phoenix,如何调用带有 starts_with 的 find_if 调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:37 24 4
gpt4 key购买 nike

我正在尝试在结构 vector 中查找元素。该代码在以区分大小写的方式进行搜索时有效。当我尝试将其 boost 为不区分大小写时,我遇到了两个问题。

  1. 简单地包含 boost/algorithm/string.hpp 会破坏以前工作的 VS2010 构建。错误是“'boost::phoenix::bind':对重载函数的模糊调用”。在 Xcode 中构建正常。有什么方法可以消除绑定(bind)的歧义?

  2. 我想我在第二个(注释掉的)find_if 行中有语法错误,添加了 istarts_with 调用。我从 phoenix header 中收到错误消息“错误:没有名为‘type’的类型”。假设问题 #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;
}

最佳答案

您需要两次绑定(bind)才能使其正常工作。首先定义:

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 的定义可能是不必要的,但我找不到合适的方法来替换它。

关于c++ - 使用 boost phoenix,如何调用带有 starts_with 的 find_if 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8496748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com