Функтор предиката, наследуемый от unary_function, это не функция, принимающая 1 аргумент

У меня есть класс функтора, унаследованный от unary_function:

template<class T>
class Matcher : public std::unary_function<T, bool>
{
private:
int m_match;

public:
Matcher(int valToMatch) : m_match(valToMatch) { };
bool operator() (T toTest)
{
return T.prop == m_match;
}
}

Функция, которая использует одну из следующих вещей:

void DoStuff(std::unary_function<ThisType, bool> & pred,
vector<ThisType> & stuffToTest)
{
for(vector<ThisType>::iterator it = stuffToTest.begin();
it != stuffToTest.end(); ++it)
{
if(pred(*it))      // <<< Compiler complains here
{
// do stuff
}
}
}

Исходная вызывающая функция:

Matcher myMatcher<ThisType>(n);
// have vector<ThisType> myStuff
DoStuff(myMatcher, myStuff);

Насколько я знаю, у меня есть шаблонный функтор, из которого я создаю экземпляр с типом ThisType, который я передаю функции, ожидающей аргумент unary_function, и вызываю ее с экземпляром ThisType.

Но компилятор жалуется, что «термин не оценивает функцию, принимающую 1 аргумент».

Что мне не хватает?

0

Решение

Это потому, что даже если вы передаете объект производного класса в функцию, параметр функции по-прежнему std::unary_function который не имеет члена operator() принимая один аргумент. Отсюда и ошибка.

Я бы предложил вам изменить свою функцию на шаблон функции как:

template<typename F>
void DoStuff(F && pred, vector<ThisType> & stuffToTest)
{
for(auto it = stuffToTest.begin(); it != stuffToTest.end(); ++it)
{
if(pred(*it))
{
// do stuff
}
}
}
5

Другие решения

unary_function это не полиморфный тип, это просто базовый класс, который должен предоставить argument_type а также result_type типы членов.

Вы можете перейти к вашему DoStuff функция а std::function<bool(ThisType)> или ты делаешь себя DoStuff шаблон функции

2

По вопросам рекламы [email protected]