我想将一种类型的结构传递给一个函数,然后它将遍历这些结构的向量来检查一个条件。无论如何这可能吗?
"software"
答案 0 :(得分:0)
你不能用字段来做。我不确定你是否可以使用占位符为第一个参数(对象)绑定实例函数。如果是这样,你可以使用&#34;类顺序绑定&#34; std::function<int(void)>
作为getChampIndex
的第一个参数,将其绑定到结构的值getter(是的,这种方法需要int get_champID()
等)并连续调用它与所有成员你的冠军名单,将实际的冠军实例作为第一个参数传递。
这应该至少需要C ++ 11(不知道什么时候进入,我在过去的几个月里一直用C ++ 14编写代码),而且,在可读性和健壮性方面,这是一个糟糕的设计。如果你需要这个,它肯定是严重设计错误的代码味道。
答案 1 :(得分:0)
我假设vector<string> Champions
是vector<CHAMPION>
,否则整个getChampIndex
没有意义。
您可以使用指向成员的指针将成员传递给getChampIndex
。
#include <vector>
#include <algorithm>
static constexpr int EMPTY = -1;
struct CHAMPION{
int champ_ID;
int weaponL_ID;
int weaponR_ID;
};
typedef int CHAMPION::*FieldPointer;
std::vector<CHAMPION> Champions;
std::vector<CHAMPION>::size_type getChampIndex(FieldPointer field, int value){
auto const i = std::find_if( Champions.begin(), Champions.end(), [&](auto const& c) {return (c.*field) == value;} );
// what do we do if there is no element with searched value?
return i - Champions.begin();
}
int main(int argc, char* argv[]) {
//fill Champions vector
auto SearchedChamp = getChampIndex(&CHAMPION::champ_ID, 17);
//process SearchedChamp
auto NoWeaponL = getChampIndex(&CHAMPION::weaponL_ID, EMPTY);
//process NoWeaponL
auto NoWeaponR = getChampIndex(&CHAMPION::weaponR_ID, EMPTY);
//process NoWeaponR
}
我认为结构本身的设计不太适合,但这很难从问题描述来判断。如果你必须坚持设计,我可能不会使用这种技术,只需使用lambda函数:
template<typename Predicate>
std::vector<CHAMPION>::size_type getChampIndex(Predicate pred){
auto const i = std::find_if( Champions.begin(), Champions.end(), pred );
return i - Champions.begin();
}
int main(int argc, char* argv[]) {
//fill Champions vector
auto SearchedChamp = getChampIndex([](CHAMPION const& c) {return c.champ_ID == 17; } );
//process SearchedChamp
auto NoWeaponL = getChampIndex([](CHAMPION const& c) {return c.weaponL_ID == EMPTY;} );
//process NoWeaponL
auto NoWeaponR = getChampIndex([](CHAMPION const& c) {return c.weaponR_ID == EMPTY;});
//process NoWeaponR
}