2016-12-16 34 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

任何你不想使用int和bools向量的理由? – UKMonkey

+0

好吧,如果這些將只是布爾和整數,並假設數量和重複是相當低的,你可以使用整數數組。 –

回答

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什麼原生支持手段方面的經驗,但也有大量的投遞替代標準::地圖狀這one

+0

謝謝,看起來很有希望。實際上,我可以讓循環搜索具有特定字段內容的元組。 –

+0

UE4支持的變量非常有限,但這並不意味着我不能使用任何我想要的東西,這僅表示我無法訪問編輯器內部不受支持的變量,僅在代碼中。但沒關係,我想我可以創建存取函數 –