Tôi có một lớp CMyVector
chứa một vector con trỏ tới các đối tượng CMyClass
và tôi có một số chức năng "tìm" để tìm các phần tử theo các tiêu chí khác nhau. Ví dụ: tôi có:Cách chuyển vị ngữ làm tham số chức năng
CMyClass* CMyVector::FindByX(int X);
CMyClass* CMyVector::FindByString(const CString& str);
CMyClass* CMyVector::FindBySomeOtherClass(CSomeOtherClass* ptr);
// Other find functions...
Lúc đầu, chúng được thực hiện dưới dạng vòng, di chuyển vectơ, tìm kiếm phần tử khớp với X, str, ptr hoặc bất kỳ thứ gì. Vì vậy, tôi đã tạo vị, như thế này một:
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));
}
};
Và kết thúc với một loạt các chức năng mà tất cả trông như thế này:
CMyClass* CMyVector::FindByX(int x)
{
CMyVector::iterator it = find_if(vec.begin(), vec.end(), IsSameX(x));
if (it != vec.end())
{
return *it;
}
return NULL;
}
Tất cả họ đều giống nhau, ngoại trừ các vị đó là gọi, vì vậy tôi đã nghĩ đến việc đơn giản hóa hơn, và tạo ra một chức năng như thế này:
CMyClass* CMyVector::Find(ThisIsWhatIDontKnow Predicate)
{
CMyVector::iterator it = find_if(vec.begin(), vec.end(), Predicate);
if (it != vec.end())
{
return *it;
}
return NULL;
}
và làm:
CMyClass* CMyVector::FindByX(int x)
{
return Find(IsSameX(x));
}
Và cứ tiếp tục như vậy.
Vì vậy, câu hỏi của tôi là: Làm cách nào để khai báo hàm Find
của tôi để tôi có thể chuyển vị ngữ của tôi? Tôi đã thử một số cách, nhưng không có may mắn cho đến nay.
Bạn có thể bọc mẫu tìm trong mẫu khác như được đề xuất hoặc sử dụng 'const std :: function &' làm tham số biến vị ngữ. – AJG85