在operator()()中使用带有状态和两个参数的函数对象的boost bind

时间:2014-05-31 15:27:29

标签: c++ c++11 boost boost-graph

我在执行以下操作时遇到了一些麻烦:在boost图中使用boost :: bind / std :: bind。

//function object 
template  <typename graph_t>
struct my_functor {
 public: 
   my_functor() {  } 
   my_functor(graph_t&  _G) : G(_G) {   } 

  template <typename edge_t>
  bool operator() (const edge_t&   edge1, const edge_1&  edge2) {
     //do something with edge properties. 
     // return true or false as per condition
  }
 private:
   graph_t&  G;
 };

 //boost graph 
 Graph_t   G;  // add some edges /properties etc. 

 //store the edges in some container
 edge_container_t   edge_set;   //edge_container_t  is say a std::vector<edge_descriptor>

 //now the code
 my_functor<graph_t>  func(G);  //initialize a function 

 //I want to bind by function object here so that it accepts two edges  in the operator()() of function 
 //object. 

 auto bind_func = std::bind(func, _1, _2);  //_1, _2  should take edge1 and edge2 as arguments


 for (const auto& edge1 : edge_set) {
    for (const auto& edge2 : edge_set { 
       if (edge1 != edge2) 
        bool y = bind_func(edge1, edge2)  // bind_func  returns a bool 
    }
  }

我在创建bind_func时做错了什么,但我对文档有点困惑。 如果我想使用boost :: bind,我该怎么做?

请在这种情况下提供帮助。 我使用反复试验得到的一些错误: 1.占位符_1,_2未在范围内声明(我确实包括它仍然来了 2.如果我使用boost :: bind代替std :: bind,它会给出一些unwrapper错误。

1 个答案:

答案 0 :(得分:2)

占位符位于命名空间std::placeholders中:

auto bind_func = std::bind(f, std::placeholders::_1, 
                              std::placeholders::_2);  //_1, _2  should take edge1 and edge2 as arguments

应该编译好。 我没有真正看到为什么你将f绑定到任何地方,使用bind_funcf相比毫无优势。