gpt4 book ai didi

c++ - 通用查找方法?

转载 作者:行者123 更新时间:2023-11-27 22:32:02 25 4
gpt4 key购买 nike

我想要一种从 vector 中检索数据的通用方法。

我有以下类和 vector :

class myClass
{
public:

myClass(int myX, float myZ, std::string myFoo)
: x ( myX )
, z ( myZ )
, foo ( myFoo )
{

}
myClass()
{

}

int x;
float z;
std::string foo;

} ;
std::vector < myClass > myVector;

(完整代码可见:http://codepad.org/iDD1Wme5)

在这个例子中,我希望能够基于“z”或“foo”成员检索 vector 中的对象,而不必编写另外两个类似于“FindDataById”的函数。

这可能吗?

最佳答案

您可以使用模板和指向成员的指针。

typedef vector<myClass> myVector;

template<typename T>
bool FindDataById(const T &id, T myClass::* idMember, myClass &theClass,
const myVector &theVector)
{
for(myVector::const_iterator itr = theVector.begin(); itr != myVector.end();
++itr){
if((*itr).*idMember == id){
theClass = *itr;
return true;
}

return false;
}

然后调用,例如,

FindDataById(string("name"), &myClass::foo, theClass, theVector)
FindDataById(5, &myClass::x, theClass, theVector)
FindDataById(5.25f, &myClass::z, theClass, theVector)

或者,使用 find_if 的想法:

template<typename T>
struct Finder {
T val_;
T myClass::* idMember_;

Finder(T val, T myClass::* idMember) : val_(val), idMember_(idMember) {}
bool operator()(const myClass &obj) { return obj.*idMember_ == val_; }
};

并使用:

find_if(theVector.begin(), theVector.end(), Finder<string>("name", &myClass::foo))
find_if(theVector.begin(), theVector.end(), Finder<int>(5, &myClass::x))
find_if(theVector.begin(), theVector.end(), Finder<float>(3.25f, &myClass::z))

有关自动推导模板参数的方法,请参阅 MSalters 的答案。

关于c++ - 通用查找方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1137228/

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