使用 find_if 和 boost::bind 与一组 shared_pointers
Using find_if and boost::bind with a set of shared_pointers
我有一个shared_ptr的向量,我想结合boost shared_ptr并绑定在一起。
我的问题与 this 非常相似,除了我想调用“&Element::Fn”而不是“&MyClass::ReferenceFn”。
这是一段类似的代码:
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。
要为存储在集合中的每个对象调用成员函数,您需要使用占位符作为 boost::bind
的第一个绑定参数:
boost::bind(&Vertex::id, _1) == (*it)->id())
// ~^~
这样,每个参数a
,将绑定到一个成员函数指针,并被调用为(a.*&Vertex::id)()
。
但是,看到报错信息是unresolved overloaded function type
,就得出结论,你的classVertex
可以有多个成员函数id
的重载。因此,编译器无法判断应该将哪一个作为 boost::bind
的参数传递。要解决这个问题,请使用对成员函数指针的显式转换(冒号后的星号表示它是指向成员的指针):
boost::bind(static_cast<int(Vertex::*)()const>(&Vertex::id), _1) == (*it)->id())
// ~~~~~~~~~~~~~~~~~~~~^
如果 class Vertex
有多个重载,比如:
int id() const { return 0; }
void id(int i) { }
您将使用第一个进行绑定。
我有一个shared_ptr的向量,我想结合boost shared_ptr并绑定在一起。
我的问题与 this 非常相似,除了我想调用“&Element::Fn”而不是“&MyClass::ReferenceFn”。
这是一段类似的代码:
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。
要为存储在集合中的每个对象调用成员函数,您需要使用占位符作为 boost::bind
的第一个绑定参数:
boost::bind(&Vertex::id, _1) == (*it)->id())
// ~^~
这样,每个参数a
,将绑定到一个成员函数指针,并被调用为(a.*&Vertex::id)()
。
但是,看到报错信息是unresolved overloaded function type
,就得出结论,你的classVertex
可以有多个成员函数id
的重载。因此,编译器无法判断应该将哪一个作为 boost::bind
的参数传递。要解决这个问题,请使用对成员函数指针的显式转换(冒号后的星号表示它是指向成员的指针):
boost::bind(static_cast<int(Vertex::*)()const>(&Vertex::id), _1) == (*it)->id())
// ~~~~~~~~~~~~~~~~~~~~^
如果 class Vertex
有多个重载,比如:
int id() const { return 0; }
void id(int i) { }
您将使用第一个进行绑定。