如何将谓词作为函数参数传递
How to pass predicate as function parameter
我有一个类CMyVector
,它包含指向CMyClass
对象的指针向量,我有几个"查找"函数来根据不同的标准查找元素。例如,我输入:
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;
}
And do:
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::函数可以与所有其他实现一起存在于源文件(.cpp)中。
相关文章:
- 如何在C++中将迭代器作为函数参数传递
- 为什么我不能将引用作为 std::async 的函数参数传递
- 节点插件 API 将数组作为函数参数传递
- 将字符串数组作为函数参数传递
- 如何通过 C++ 中的函数参数传递初始值设定项列表的固定大小的初始值设定项列表?
- 我可以动态创建新地图并作为函数参数传递吗?
- 将任意模板向量作为函数参数C++传递
- 将函数指针作为函数参数传递的目的
- C++:通过函数参数传递的值给出不同的结果
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 通过宏将函数参数传递给函数
- C++:访问作为函数参数传递的双指针数组所指向的变量的值
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 将派生类构造函数参数传递给受保护的成员
- 将指向数组的指针作为函数参数传递,这本身就是另一个函数的返回值?
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 如何将变量作为构造函数参数或函数参数传递
- 当数组对象以函数参数传递时,为什么复制构造函数会自称