- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
不确定如何命名这个问题,因为问题本身正在寻找一个我不知道其名称的结构。
问题是我正在处理控制流很大程度上依赖于数据的程序。
例如,我创建了一个 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/
我正在制作一个 html/javascript 浏览器主页,它可以下载到任何计算机上——您只需从您的计算机上运行 *.html 文件,它就会在您的默认浏览器中打开;在其中你有一个紧凑的主页,有几个选项
我是一名优秀的程序员,十分优秀!