2012-02-13 42 views
4

编译这个例子使用boost字符串变换算法谓词绑定

#include <boost/bind.hpp> 
#include <boost/algorithm/string.hpp> 
#include <algorithm> 
#include <iostream> 
#include <vector> 

using namespace std; 

int main(int , char**) 
{ 
    vector<string> test; 

    test.push_back("xtest2"); 
    test.push_back("test3"); 

    ostream_iterator<string> out_it(cout, "\n"); 

    remove_copy_if(test.begin(), test.end(), out_it,  
        boost::bind(boost::algorithm::starts_with, _1, "x")); 
} 

失败,错误

no matching function for call to 
‘bind(<unresolved overloaded function type>, boost::arg<1>&, const char [2])’ 

有什么不对所使用的bind电话吗?

回答

5

no matching function for call to ‘bind(<unresolved overloaded function type>, boost::arg<1>&, const char [2])’

所以......解决<unresolved overloaded function type>

remove_copy_if(test.begin(), test.end(), out_it, boost::bind(
    boost::algorithm::starts_with<std::string, std::string>, _1, "x")); 

输出继电器:

$ g++ ./test.cpp ./a.exe 
test3 

有了多一点的工作,你可以把它不太难看键入。以下几种变化:

#include <boost/bind.hpp> 
#include <boost/algorithm/string.hpp> 
#include <algorithm> 
#include <iostream> 
#include <vector> 

using namespace std; 

namespace my // for alternative styles 
{ 
    static bool starts_with(const std::string& s, const std::string& prefix) 
    { 
     return boost::algorithm::starts_with(s, prefix); 
    } 

    struct starts_with_s 
    { 
     starts_with_s(const std::string& prefix) : _p(prefix) {} 
     bool operator()(const std::string& s) const { 
      return boost::algorithm::starts_with(s, _p); 
     } 
     private: const std::string _p; 
    }; 
} 


int main(int , char**) 
{ 
    vector<string> test; 

    test.push_back("xtest2"); 
    test.push_back("test3"); 

    ostream_iterator<string> out_it(cout, "\n"); 

    remove_copy_if(test.begin(), test.end(), out_it,  
        boost::bind(boost::algorithm::starts_with<std::string, std::string>, _1, "x")); 

    remove_copy_if(test.begin(), test.end(), out_it,  
        boost::bind(my::starts_with, _1, "x")); 

    my::starts_with_s pred("x"); 
    remove_copy_if(test.begin(), test.end(), out_it, pred); 

    // using c++0x style lambdas 
    const std::string prefix = "x"; 
    remove_copy_if(test.begin(), test.end(), out_it, [&prefix](const std::string& s) 
      { return boost::algorithm::starts_with(s, prefix); }); 
} 
+0

啊,编译器不知道'starts_with()'中有哪两个重载我在说,所以我必须使用模板参数明确地告诉他。正确? – nabulke 2012-02-13 11:40:02

+0

确实。如果你想少做(丑)打字 – sehe 2012-02-13 11:45:23

+0

添加替代方法哇,非常感谢你这个详尽的答案。我想我会打印出来,并用别针把它上面我的台式机以供将来参考:-) – nabulke 2012-02-13 11:54:04

-1

如果你的编译器支持一些C++ 11,你可以使用std ::绑定。在C++ 11中,你会使用std :: placeholders :: _ 1,所以它可能是boost :: placeholders :: _ 1。

+0

没有'boost :: placeholders'。 '_1'工作得很好。 – nabulke 2012-02-13 11:36:05