gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:39:31 24 4
gpt4 key购买 nike

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

CMyClass* CMyVector::FindByX(int X);
CMyClass* CMyVector::FindByString(const CString& str);
CMyClass* CMyVector::FindBySomeOtherClass(CSomeOtherClass* ptr);
// Other find functions...

起初,它们被实现为循环,遍历 vector ,寻找匹配 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::FindByX( int x )
{
CMyVector::iterator it = find_if(vec.begin(), vec.end(), IsSameX(x));
if (it != vec.end())
{
return *it;
}
return NULL;
}

它们看起来都一样,除了被调用的谓词,所以我想到了进一步简化,并创建了一个像这样的函数:

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;
}

您也可以随时使用 std::function (c++11)

CMyClass* CMyVector::Find(std::function<bool(const (CMYClass*)&)> Predicate)
{
CMyVector::iterator it = find_if(vec.begin(), vec.end(), Predicate);
if (it != vec.end())
{
return *it;
}
return NULL;
}

我个人更喜欢上面的那个,因为编译器可能更容易优化,因为间接寻址更少。如果调用是唯一的,它可能会被内联。

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

关于c++ - 如何将谓词作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8387621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com