Я просматривал следующий пример, который я получил из другого поста SO.The пример что-то вроде этого
class checker
{
public:
bool operator()(unsigned int i)
{
if (i%2 == 0)
{
return true; --------------->Statement A
}
return false;
}
};
std::vector<int> vec;
vec.push_back(3);
vec.push_back(5);
vec.push_back(2);
if(std::find_if(vec.begin(), vec.end(), checker()) != vec.end())
{
std::cout << "Found";
}
Теперь у меня есть три вопроса относительно приведенного выше примера:
Q1- 3-й параметр find_if принимает предикат. Здесь я использую объект функтора. Предполагается ли, что предикат будет указателем (адресом) или объектом. Здесь я передаю объект, однако в этом примере на MSDN это передача адреса. Я понимаю, что в этом примере предикат не является методом-членом класса. Однако я все еще был бы признателен, если бы кто-то смог уточнить здесь требование к параметру предиката. Потому что, если он может принимать указатели на функции, то это не работает
bool (checker::*aptr)(unsigned int) = NULL; //Function ptr of class method
aptr = &(checker::operator());
if(std::find_if(vec.begin(), vec.end(), aptr) != vec.end()){...};
Q2 — Хотя приведенный выше пример работает нормально, однако, когда я ставлю точку останова в операторе A, точка останова никогда не получает попаданий, и, как предполагалось, вернула истину. Разъяснение по этому вопросу было бы полезно.
Q3- Некоторые примеры получили структуру / класс из std::unary_function<key_struct, bool>
В чем причина этого. Класс выше работает хорошо для меня. Почему необходимо извлечь его из std::unary_function<key_struct, bool>
?
bool
, Это может быть объект функции, то есть объект класса с оператором вызова функции или указатель функции. Если вы не модифицируете свой объект, вы, вероятно, должны сделать оператор вызова функции const
,inline
потому что есть огромная разница в производительности.std::not1()
с функциональным объектом им нужно было определить определенные вложенные типы. Для нормальных функций соответствующие ассоциированные типы, например, тип возвращаемого значения и типы аргумента, могут быть легко выведены. Для объектов функций они не могут быть выведены в C ++ 03. В C ++ 11 все вложенные типы не нужны (если я правильно помню). В любом случае, std::find_if()
не нужно возиться с объектом функции после его вызова, т. е. ни один из вложенных типов на самом деле не нужен.Кстати, есть ли причина, по которой ваш предикат не просто возвращает результат выражения? То есть я бы реализовал это так:
struct checker {
bool operator()(unsigned int i) const { return (i % 2) == 0; }
};
Других решений пока нет …