使用find_if和boost :: bind与一组shared_pointers

时间:2016-03-23 15:45:51

标签: c++ boost shared-ptr boost-bind

我有一个shared_ptr的向量,我想将boost shared_ptr和bind绑定在一起。

我的问题与this非常相似,只是代替"& MyClass :: ReferenceFn"我想打电话给"& Element :: Fn"。

这是一段类似的代码:

typedef boost::shared_ptr< Vertex > vertex_ptr; 
std::set<vertex_ptr> vertices;

void B::convert()
{
...
if( std::find_if(boost::make_indirect_iterator(vertices.begin()), 
                 boost::make_indirect_iterator(vertices.end() ),  boost::bind( &Vertex::id, boost::ref(*this), _1 ) == (*it)->id() ) == vertices.end() )
}

这是错误:

no matching function for call to ‘bind(<unresolved overloaded function type>, const boost::reference_wrapper<B>, boost::arg<1>&)’

注意:我只能使用C ++ 03。

1 个答案:

答案 0 :(得分:2)

要为存储在集合中的每个对象调用成员函数,您需要使用占位符作为boost::bind的第一个绑定参数:

boost::bind(&Vertex::id, _1) == (*it)->id())
//                       ~^~

这样,每个参数a将绑定到一个成员函数指针,并被称为(a.*&Vertex::id)()

但是,看到错误消息显示为unresolved overloaded function type,它会得出结论:您的类Vertex可以有多个成员函数id的重载。因此,编译器无法告诉它应该传递哪个作为boost::bind的参数。要解决此问题,请对成员函数指针使用显式强制转换(冒号后的星号表示它是指向成员的指针):

boost::bind(static_cast<int(Vertex::*)()const>(&Vertex::id), _1) == (*it)->id())
//                      ~~~~~~~~~~~~~~~~~~~~^

如果类Vertex有多个重载,请说:

int id() const { return 0; }
void id(int i) { }

您将使用第一个进行绑定。