我有一个继承自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 :(得分: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
}
}
}
答案 1 :(得分:2)
unary_function不是多态类型,它只是一个提供argument_type
和result_type
成员类型的基类。
您可以将DoStuff
函数传递给std::function<bool(ThisType)>
,或者转换为DoStuff
功能模板