C++ 如何将谓词作为函数参数传递

C++ 如何将谓词作为函数参数传递,c++,stl,vector,predicate,std,C++,Stl,Vector,Predicate,Std,我有一个类CMyVector,它包含指向CMyClass对象的指针向量,我有几个“find”函数根据不同的标准查找元素。例如,我有: CMyClass* CMyVector::FindByX(int X); CMyClass* CMyVector::FindByString(const CString& str); CMyClass* CMyVector::FindBySomeOtherClass(CSomeOtherClass* ptr); // Other find function

我有一个类
CMyVector
,它包含指向
CMyClass
对象的指针向量,我有几个“find”函数根据不同的标准查找元素。例如,我有:

CMyClass* CMyVector::FindByX(int X);
CMyClass* CMyVector::FindByString(const CString& str);
CMyClass* CMyVector::FindBySomeOtherClass(CSomeOtherClass* ptr);
// Other find functions...
起初,它们被实现为循环,遍历向量,寻找与X、str、ptr或其他匹配的元素。所以我创建了谓词,比如:

class IsSameX:public unary_function<CMyClass*, bool>
{
    int num;
public:
    IsSameX(int n):num(n){}
    bool operator()(CMyClass* obj) const 
    { 
        return (obj != NULL && (obj->X() == num)); 
    }
};
CMyClass* CMyVector::Find( ThisIsWhatIDontKnow Predicate)
{
    CMyVector::iterator it = find_if(vec.begin(), vec.end(), Predicate);
    if (it != vec.end())
    {
        return *it;
    }
    return NULL;
}
它们看起来都一样,除了被调用的谓词,所以我考虑了进一步简化,并创建了一个类似于以下的函数:

class IsSameX:public unary_function<CMyClass*, bool>
{
    int num;
public:
    IsSameX(int n):num(n){}
    bool operator()(CMyClass* obj) const 
    { 
        return (obj != NULL && (obj->X() == num)); 
    }
};
CMyClass* CMyVector::Find( ThisIsWhatIDontKnow Predicate)
{
    CMyVector::iterator it = find_if(vec.begin(), vec.end(), Predicate);
    if (it != vec.end())
    {
        return *it;
    }
    return NULL;
}
并且做:

CMyClass* CMyVector::FindByX( int x )
{
    return Find(IsSameX(x));
}
等等


所以我的问题是:我应该如何声明我的
Find
函数,以便将谓词传递给它?我已经尝试了几种方法,但到目前为止运气不佳。

使用模板接收任何需要的类型

template<typename UnaryPredicate>
CMyClass* CMyVector::Find(UnaryPredicate Predicate)
{
    CMyVector::iterator it = find_if(vec.begin(), vec.end(), Predicate);
    if (it != vec.end())
    {
        return *it;
    }
    return NULL;
}
模板
CMyClass*CMyVector::Find(一元谓词)
{
CMyVector::迭代器it=find_if(vec.begin(),vec.end(),谓词);
如果(it!=vec.end())
{
归还它;
}
返回NULL;
}
您也可以始终使用std::function(c++11)

CMyClass*CMyVector::Find(std::函数谓词)
{
CMyVector::迭代器it=find_if(vec.begin(),vec.end(),谓词);
如果(it!=vec.end())
{
归还它;
}
返回NULL;
}
就我个人而言,我更喜欢上面的那个,因为它可能更容易让编译器进行优化,因为间接寻址更少。如果调用是唯一的,它可能会被内联


编辑:还值得注意的是,如果使用模板化选项,则必须在头文件中提供实现,这可能是一个难题。而std::function可以与所有其他实现一起保存在源(.cpp)文件中。

您可以按照建议将模板包装到另一个模板中,或者使用
const std::function&
作为谓词参数。谢谢,我还没有C++11,所以我必须使用模板。