Dro*_*ped 2 c++ regex boost file
我想做这样的事情:
boost::regex re("tryme");
ifstream iss;
iss.open("file.txt");
istream_iterator<string> eos;
istream_iterator<string> iit (iss);
find(iit,eos,bind2nd(boost::regex_match),re));
Run Code Online (Sandbox Code Playgroud)
错误如下:
找不到匹配'bind2nd <_Fn2,_Ty>(bool(*)(BidiIterator,BidiIterator,match_results&,const basic_regex&,unsigned long))'
找不到'find(istream_iterator,int>,istream_iterator,int>,undefined,regex)'的匹配项
你能帮我正确地做吗?谢谢.
第一个问题是,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);
Run Code Online (Sandbox Code Playgroud)
如果你真的想要使用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));
}
Run Code Online (Sandbox Code Playgroud)
该std::bind2nd()模板不能真正与原函数指针的工作.这就是std::ptr_fun()需要使用的原因.通常,当*_fun()需要使用任何调用的标准函数时,乐趣实际上就会停止:这些函数无法处理通过引用引用参数的函数.因此,通过值my_regex_match()获取其std::string参数:std::bind2nd()将尝试创建一个函数对象,否则将引用引用作为参数.这是您可能想要使用std::bind()或的另一个原因boost::bind().
| 归档时间: |
|
| 查看次数: |
829 次 |
| 最近记录: |