2016-12-16 7 views
0

У меня есть ряд переменных bool и int, которые мне нужно получить с помощью какого-то индекса. Я нашел способ сделать это, но это кажется слишком сложным. Есть ли способ сделать это более элегантным способом?с ++ индексированный доступ к структурным переменным разных типов

На данный момент в заголовочном файле У меня есть структура

struct FDialogueFlags 
{ 
    bool tmpFlag1; 
    bool tmpFlag2; 
    // bool tmpFlagX; 

    int tmpState1; 
    int tmpState2; 
    // int tmpStateX; 
}; 

и перечисление

enum class Eflags 
{ 
    // NAME = flag_ID, 

    TMP_FLAG_1 = 1,   
    TMP_FLAG_2 = 10,     
    // TMP_FLAG_X = XX, 

    TMP_STATE_1 = 101,    
    TMP_STATE_2 = 110,   
    // TMP_STATE_X = XXX, 
}; 

И в исходном файле я функция, которая возвращает значения для данного индекса - flag_ID

int GetFlagValue(int flag_ID) 
{ 
    switch (Eflags(flag_ID)) 
    { 
    case (Eflags::TMP_FLAG_1): 
     return flagsAndStates.tmpFlag1; 
     break; 
    case (Eflags::TMP_FLAG_2): 
     return flagsAndStates.tmpFlag2; 
     break; 
    /*case (Eflags::TMP_FLAG_X): 
     return flagsAndStates.tmpFlagX; 
     break;*/ 
    case (Eflags::TMP_STATE_1): 
     return flagsAndStates.tmpState1; 
     break; 
    case (Eflags::TMP_STATE_2): 
     return flagsAndStates.tmpState2; 
     break; 
    /*case (Eflags::TMP_STATE_X): 
     return flagsAndStates.tmpStateX; 
     break;*/ 
    default: 
     break; 
    } 
} 

Таким образом, каждый раз, когда мне нужно добавлять новый «флаг» или «состояние», мне нужно редактировать 3 места в моем коде.

Кроме того, если мне нужно получить доступ к любому «знаку» или «состоянию» по его имени, записанному в перечислении, я не могу этого сделать, потому что Eflags (TMP_FLAG_1) возвращает TMP_FLAG_1, а не число. Другая важная вещь, я бы хотел сохранить переменные имена, может быть до сотни таких «флагов» и «состояний», и для них характерны уникальные имена, а не только итеративные номера (код выше - это просто например, в конечном продукте я бы назвал все из них в соответствии с их значением) Если возможно, я хотел бы избежать использования std::map, так как он не поддерживается UE4. Итак, основная идея заключается в доступе к определенному количеству переменных разных числовых типов по заданному числу, возможно, с сохранением имен переменных.

Спасибо!

+2

Зачем вам нужен доступ к ним по индексу? постоянный доступ времени или синтаксический сахар? –

+0

Любая причина, по которой вы не хотите использовать вектор ints и вектор bools? – UKMonkey

+0

хорошо, если они будут только bools и целыми числами, и если число и дублирование довольно низки, вы можете просто использовать массив целых чисел. –

ответ

3

Предполагая, что вы запрашиваете синтаксические альтернативы, можете ли вы использовать кортежи? Здесь - http://en.cppreference.com/w/cpp/utility/tuple

Они похожи на структуры, и вы можете использовать std::get для извлечения значений с помощью метода на основе индексов. Затем вы можете использовать операторы if для сравнения вместо оператора switch.

Пример -

#include <iostream> 
#include <tuple> 

int main() 
{ 
    auto t = std::make_tuple(1, true, 25); 

    std::cout << std::get<0>(t) << "\n" 
       << std::get<1>(t) << "\n" 
       << std::get<2>(t) << "\n"; 
} 

IDEONE


У меня нет никакого опыта работы с UE4 и что таким родным опорным средством, но есть многочисленные капли в альтернативах StD :: Карты, как это one.

+0

Спасибо, что выглядят очень многообещающими. Я мог бы сделать цикл поиска кортежа с конкретным полевым контентом. –

+0

UE4 имеет довольно ограниченные поддерживаемые переменные, но это не значит, что я не могу использовать что-либо, что хочу, это просто означает, что я не смог бы получить доступ к неподдерживаемым переменным внутри редактора, только в коде. Но это нормально, я думаю, что могу выполнять функции доступа –