C ++索引访问不同类型的结构变量

时间:2016-12-16 15:30:41

标签: c++ data-structures structure

我有一些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;
    }
}

每当我需要添加新的" flag"或"州"我必须在我的代码中编辑3个地方。

此外,如果我需要访问任何"标志"或"州"通过它在枚举中写的名字,我不能这样做,因为Eflags (TMP_FLAG_1)返回TMP_FLAG_1而不是数字。 另一件重要的事情,我想保留可变的命名,可能有多达数百个"标志"和"州"并且他们有独特的名称而不仅仅是迭代数字(上面的代码只是一个例子,在最终产品中我会根据它们的含义命名所有这些) 如果可能,我希望避免使用std::map,因为UE4本身不支持它。 因此,核心思想是通过给定的数量访问不同数值类型的一定数量的变量,可能保持变量命名。

1 个答案:

答案 0 :(得分:0)

假设您要求语法替代,您可以使用元组吗?在这里 - 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 :: map的替代方案,如one