0

我有一个从 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 个参数的函数”。

我错过了什么?

4

2 回答 2

5

这是因为即使您将派生类对象传递给函数,函数参数仍然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
        }
    }
}
于 2013-01-10T16:02:23.863 回答
2

unary_function不是多态类型,它只是一个提供argument_typeandresult_type成员类型的基类。

你可以传递给你的DoStuff函数 astd::function<bool(ThisType)>或者你让你的DoStuff函数模板

于 2013-01-10T16:03:59.127 回答