第一个问题是std::find()
尝试匹配值,即您需要替换std::find()
为std::find_if()
. 这很简单。
下一个问题是它boost::regex_match
不是一个函数,而是一系列函数。std::bind2nd()
不知道你想匹配这个家庭的哪个成员。此外,您显然想要使用的函数重载需要三个而不是两个参数:类型的最后一个参数boost::match_flag_type
是默认的。我让它std::bind()
使用这个:
std::bind(static_cast<bool (*)(std::string const&,
boost::regex const&,
boost::match_flag_type)>(&boost::regex_match),
std::placeholders::_1, re);
如果你真的想使用std::bind2nd()
它可能是最简单的创建一个简单的转发函数:
bool my_regex_match(std::string s, boost::regex const& r) {
return boost::regex_match(s, r);
}
void f() {
boost::regex re("tryme");
std::ifstream iss(file.txt);
std::find_if(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>(),
std::bind2nd(std::ptr_fun(&my_regex_match), re));
}
std::bind2nd()
模板不能真正使用原始函数指针。这就是为什么std::ptr_fun()
需要使用。通常,当*_fun()
需要使用任何被调用的标准函数时,乐趣实际上就停止了:这些函数无法处理通过引用获取参数的函数。因此,按值my_regex_match()
获取参数:否则将尝试创建一个函数对象,以引用引用作为参数。这是您可能想要使用or的另一个原因。std::string
std::bind2nd()
std::bind()
boost::bind()