C++ 谓词函子继承自一元函数,该函数不是带1个参数的函数

C++ 谓词函子继承自一元函数,该函数不是带1个参数的函数,c++,stl,predicate,functor,C++,Stl,Predicate,Functor,我有一个从一元函数继承的函子类: 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

我有一个从一元函数继承的函子类:

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;
    }
}
Matcher myMatcher<ThisType>(n);
// have vector<ThisType> myStuff
DoStuff(myMatcher, myStuff);
使用以下各项之一的函数:

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类型构造一个实例,我将其传递给需要一元函数参数的函数,并用ThisType实例调用

但编译器抱怨说,该项的计算结果不是一个带1个参数的函数


我遗漏了什么?

这是因为即使将派生类对象传递给函数,函数参数仍然是std::一元函数,它没有成员运算符接受一个参数。因此出现了错误

我建议您将函数更改为函数模板,如下所示:

template<typename F>
void DoStuff(F && pred, vector<ThisType> & stuffToTest)
{
    for(auto it = stuffToTest.begin(); it != stuffToTest.end(); ++it)
    {
        if(pred(*it))  
        {
             // do stuff
        }
    }
}
不是多态类型,它只是一个基类,用于提供参数类型和结果类型成员类型


您可以将std::function传递给DoStuff函数,也可以使DoStuff函数模板非常清晰。这里模板化DoStuff的唯一问题是它已经是特定于ThisType的,所以谓词将始终是predThisType。@PhilH:这不重要。如果您愿意,您可以使用std::function作为参数类型,但我不建议这样做,因为它会妨碍优化,并且会由于类型擦除而产生较慢的代码,另一方面,模板代码会产生较快的代码,因为它可能会内联functor。那么,我必须重新考虑,因为这是一个前0X,但有Tr1版本的C++。@ PhilH:哦,模板是唯一的选择;也使用F而不是F&&as参数。谢谢,不幸的是,我没有使用此编译器访问C++11的权限。