У меня есть класс функтора, унаследованный от 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 аргумент».
Что мне не хватает?
Это потому, что даже если вы передаете объект производного класса в функцию, параметр функции по-прежнему 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
}
}
}
unary_function это не полиморфный тип, это просто базовый класс, который должен предоставить argument_type
а также result_type
типы членов.
Вы можете перейти к вашему DoStuff
функция а std::function<bool(ThisType)>
или ты делаешь себя DoStuff
шаблон функции