首先,你需要确保,当你使用它的比较级是可以确定的:在前面定义的移动MyComparator
定义countNames()
将是我的第一步。也就是说,bind2nd()
想知道它所处理的函数对象比你提供的要好一些:它通常想知道result_type
,first_argument_type
和second_argument_type
。你可以从std::binary_function<bool, CFileType const*, std::string const&>
或明确定义它们。虽然我不认为这是必需的,但您可能需要使函数调用运算符const
。另一方面,如果你正在定义一个函数对象而不是一个函数(你可以使用std::ptr_fun()
来获得必要的typedef
;个人而言,我认为这个名字的意思是让这些人有吸引力,因为它肯定不是很多有趣当你不得不使用它们),你可以去整个的方式,而不是用在首位粘合剂争战
class MyComparator {
public:
MyComparator(std::string const& value): value_(value) {}
bool operator()(CFileType const* obj) const {
return obj->getName() == this->value_;
}
private:
std::string value_;
};
...
std::count_if(files.begin(), files.end(), MyComparator(name));
您可以定义一个函数,并结合其在使用粘合剂得到大致相同的效果。 Typeically,我做错了,当我不尝试一下代码,但它会是这个样子:
bool myComparator(CFileType const* obj, std::string name) {
return obj->getName() == name;
}
...
std::count_if(files.begin(), files.end(),
std::bind2nd(std::ptr_fun(myComparator), name));
如果你觉得你想通过引用传递的参数name
而不是复制这一切的时候,您将无法使用std::bind2nd()
,至少除非您使用C++ 2011编译器:否则它将创建一个类型,该类型必须连续编译器不会喜欢的const
关键字。您可以使用例如boost::bind()
不存在这个问题:
std::count_if(files.begin(), files.end(), boost::bind(myComparator, _1, name));
...并改变name
参数的声明是std::string const& name
。
非常感谢,它工作完美,它比使用** bold ** bind2nd()**更加紧凑** bold ** – Goshutu 2012-03-06 10:35:04
@Goshutu我忘记了通过引用传递向量(请参阅编辑) 。这不会影响正确性,但会影响性能,因为每次调用“CountMatchingNames”时不再需要复制向量。 – 2012-03-06 10:59:40
没有问题,因为这是一个类的成员函数 – Goshutu 2012-03-06 17:46:14