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的权限。