c++ - c++中的数据控制程序

标签 c++ arrays list dictionary

不确定如何命名这个问题,因为问题本身正在寻找一个我不知道其名称的结构。

问题是我正在处理控制流很大程度上依赖于数据的程序。

例如,我创建了一个 MIPS 模拟器,它实现了一个包含 50 多条指令的列表,每条指令都是独立实现的,并且一切都由一个巨大的 switch case 控制

switch (function){ //Function is an int, each function (eg SLL) is 
        case 0:    //associated with one
            if (state->debug_level > 0){
                fprintf(state->debug_out, "SLL\n");
            }
            step_err = SLL(state, rs, rt, rd, sa);
            break;
        case 2:
            if (state->debug_level > 0){
                fprintf(state->debug_out, "SRL\n");
            }
            step_err = SRL(state, rs, rt, rd, sa);
            break;
        case 3:
            if (state->debug_level > 0){
                fprintf(state->debug_out, "SRA\n");
            }
//

有人告诉我,这可以使用函数指针来实现,但要做到这一点,我正在寻找一种将任何类型的数据相关联的方法,例如将字符串与其他数据(例如整数)相关联。我知道 map ,但不想推回每一对。我正在寻找某种类似数组的语法,我想如果以前见过它可能看起来类似于这样:

¿type? function_codes[]{
     0, "SLL";
     2, "SRL";
     3, "SRA";
     ...
 }

我不是在寻找这个问题的解决方案,而是在寻找一种在数据之间快速引入关系并使用它来修改控制流的通用方法。

回答后编辑 我实际上在寻找但我不知道的确实是 map ,但特别是它的初始化语法类似于数组(参见接受的答案)。这与函数指针一起使用完成了所需的工作。

最佳答案

如您所料,函数指针实际上是一种很好的方法。由于您指定不想使用 Map,因此这就是您使用函数指针数组实现基于整数的函数分派(dispatch)的方式。请注意,因为我不知道您的 MIPS 函数(SLL、SRL 等)的类型签名,所以我使用了虚拟占位符类型名称。

typedef ret_t (*mips_func)(arg1_t, arg2_t, arg3_t, arg4_t, arg5_t);

mips_func function_codes[] = {
    &SLL,
    &SRL,
    &SRA,
    ...
};

//...Later, in the part of your code that used to contain the big switch statement
step_err = (*function_codes[function])(state, rs, rt, rd, sa);

语法 &SLL获取指向函数 SLL 的指针,我假设它已经在范围内,因为您可以直接从 switch 语句调用它。

请注意,这假设函数的数字代码是从 0 到 [最大代码值] 的连续整数序列。如果一些数字代码未使用,那么您将需要在数组中保留显式间隙(通过在一个或多个条目中放置 NULL 指针)或使用 std::map<int, mips_func>这样您就可以使用任意非连续整数值作为函数的键。幸运的是,使用 Map 仍然不需要 push_back ing 每个元素,因为 C++ 现在有初始化列表。使用 Map 的相同代码如下所示:

typedef ret_t (*mips_func)(arg1_t, arg2_t, arg3_t, arg4_t, arg5_t);

std::map<int, mips_func> function_codes = {
    {0, &SLL},
    {2, &SRL},
    {4, &SRA},
    ...
};

//Using the Map looks exactly the same, due to its overloaded operator[]
step_err = (*function_codes[function])(state, rs, rt, rd, sa);

关于c++ - c++中的数据控制程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34909174/

相关文章:

c++ - 如何引用全局命名空间

c++ - 回调:将函数指针作为参数并传递一个附加参数

javascript - 添加和显示数组问题

没有引用的Java数组传递

python - 生成 生成 numpy 数组

python - 使用带受让人的切片表示法为列表赋值

c++ - firstprivate 变量构造中是否允许 OpenMP 调用和指令?

c++ - 将类成员函数作为参数传递

arrays - 查找二维数组中岛屿的长度分布?

excel - 复制并粘贴回excel中的过滤列表