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のインスタンスを使用して呼び出します。

しかし、コンパイラは「termは1つの引数を取る関数に評価されない」と文句を言います。

私は何が欠けていますか?

4

2 に答える 2

5

これは、派生クラス オブジェクトを関数に渡しているにもかかわらず、関数パラメーターが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
        }
    }
}
于 2013-01-10T16:02:23.863 に答える
2

unary_functionargument_typeはポリモーフィック型ではなく、およびresult_typeメンバー型を提供するために存在する単なる基本クラスです。

DoStuff関数に渡すstd::function<bool(ThisType)>か、DoStuff関数テンプレートを作成します

于 2013-01-10T16:03:59.127 に答える