2016-12-16 58 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支持的变量非常有限,但这并不意味着我不能使用任何我想要的东西,这仅表示我无法访问编辑器内部不受支持的变量,仅在代码中。但没关系,我想我可以创建存取函数 –