Прежде всего, вы должны убедиться, что ваш класс сравнения известен, когда вы его используете: перемещение моего определения MyComparator
перед определением countNames()
будет моим первым шагом. Тем не менее, bind2nd()
хочет знать объекты-функции, с которыми он имеет дело, немного лучше, чем вы, что вы предлагаете: обычно оно хочет знать result_type
, first_argument_type
и second_argument_type
. Вы можете получить их из std::binary_function<bool, CFileType const*, std::string const&>
или явно указав их. Хотя я не думаю, что это требуется, вы можете захотеть сделать оператор вызова функции const
. С другой стороны, если вы определяете объект функции, а не функцию (для которой вы могли бы получить необходимые typedef
s, используя 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()
, у которого нет этой проблемы:
std::count_if(files.begin(), files.end(), boost::bind(myComparator, _1, name));
... и измените объявление параметра name
на std::string const& name
.