2016-07-22 4 views
-4

Я хочу передать тип структуры функции, которая затем будет циклически проходить через вектор этих структур для проверки состояния. Это так или иначе возможно?Передача типа struct C++

#define EMPTY -1 
struct CHAMPION{ 
    int champ_ID; 
    int weaponL_ID; 
    int weaponR_ID; 
} 

vector<string> Champions; 

int getChampIndex("struct_obj" obj, int value){ 
    for(int i=0; i<Champions.size(); i++){ 
     if(Champions[i].obj == value){return i;} 
    } 
} 

int main(){ 
    //fill Champions vector 

    SearchedChamp = getChampIndex(champ_ID, 17); 
    //process SearchedChamp 

    NoWeaponL = getChampIndex(weaponL_ID, EMPTY); 
    //process NoWeaponL 

    NoWeaponR = getChampIndex(weaponR_ID, EMPTY); 
    //process NoWeaponR 

} 
+0

Поиск вопросов по поиску элементов в векторе. – juanchopanza

+0

Предоставленный код (псевдо) не имеет никакого смысла. – Arunmu

+0

Вопрос очень плохо написан. Но, похоже, вы пытаетесь получить доступ к отдельным членам структуры. Если это так, есть способ. – zeb

ответ

0

Вы не можете делать это с полями. Я не уверен, можно ли связать функции экземпляра с помощью заполнителя для первого аргумента (объекта). Если это так, вы можете использовать «class-wise bound» std::function<int(void)> в качестве первого аргумента для вашего getChampIndex, привязать его к своим getter-ресурсам (да, этот подход требует int get_champID() и т. Д.) И вызывать его последовательно со всеми членами списка ваших чемпионов , передавая действительный экземпляр чемпиона в качестве первого параметра. Это должно потребоваться, по крайней мере, для C++ 11 (не уверен, что произошло, когда я кодировал C++ 14 в течение последних нескольких месяцев), плюс, это ужасный дизайн с точки зрения удобочитаемости и надежности. И если вам это нужно, это определенно запах кода серьезных ошибок дизайна.

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 
} 

Я думаю, что конструкция самой структуры не очень хорошо подходит, но это трудно судить по описанию проблемы. Если вам нужно придерживаться дизайна, я бы, вероятно, не использовал эту технику и просто пошел с лямбда-функциями:

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 
} 
Смежные вопросы