首先,您需要确保在使用比较类时知道它:将定义移到定义MyComparator
前面countNames()
是我的第一步。也就是说,bind2nd()
它想知道它处理的函数对象比你提供的要好一点:它通常想知道result_type
、first_argument_type
和second_argument_type
。您可以通过 fromstd::binary_function<bool, CFileType const*, std::string const&>
或通过显式定义它们来获取它们。尽管我认为这不是必需的,但您可能希望使函数调用 operator const
。另一方面,如果你定义的是一个函数对象而不是一个函数(你可以得到必要typedef
的 s using std::ptr_fun()
; 我个人认为这个名字是为了让这些人有吸引力,因为它肯定不是很多当你必须使用它们时很有趣),你可以一直走下去,而不是一开始就干涉活页夹:
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));
在定义函数并绑定它时,您可以使用绑定器获得大致相同的效果。通常,当我不尝试代码时会出错,但它看起来像这样:
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()
不存在此问题的 eg:
std::count_if(files.begin(), files.end(), boost::bind(myComparator, _1, name));
...并将name
参数的声明更改为std::string const& name
.