传递一种结构c ++

时间:2016-07-22 06:07:06

标签: c++ struct

我想将一种类型的结构传递给一个函数,然后它将遍历这些结构的向量来检查一个条件。无论如何这可能吗?

"software"

2 个答案:

答案 0 :(得分:0)

你不能用字段来做。我不确定你是否可以使用占位符为第一个参数(对象)绑定实例函数。如果是这样,你可以使用&#34;类顺序绑定&#34; std::function<int(void)>作为getChampIndex的第一个参数,将其绑定到结构的值getter(是的,这种方法需要int get_champID()等)并连续调用它与所有成员你的冠军名单,将实际的冠军实例作为第一个参数传递。 这应该至少需要C ++ 11(不知道什么时候进入,我在过去的几个月里一直用C ++ 14编写代码),而且,在可读性和健壮性方面,这是一个糟糕的设计。如果你需要这个,它肯定是严重设计错误的代码味道。

答案 1 :(得分:0)

我假设vector<string> Championsvector<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
}