【发布时间】:2021-08-23 03:15:09
【问题描述】:
TL;DR 如果x = x(); 在 C 中有效,x 的类型应该是什么?
整个故事:
我正在开发一个包含多个场景的简单游戏。起初我的代码是这样的:
enum {kSCENE_A, kSCENE_B} ecene = kSCENE_A;
int main() {
while(1) {
switch(scene) {
case kSCENE_A:
// Renders scene a
// And possibly modifies `scene`
break;
case kSCENE_B:
// Renders scene b
// And possibly modifies `scene`
break;
}
}
}
但是main 函数过于冗长。我将渲染部分提取到不同的函数中,但switch 仍然使代码难看。我为此定义了一个scene_map:
typedef enum {
kSCENE_A,
kSCENE_B,
kN_SCENES
} Scene;
Scene RenderSceneA();
Scene RenderSceneB();
int main() {
Scene scene = kSCENE_A;
Scene (*scene_map[kN_SCENES])();
scene_map[kSCENE_A] = SceneA;
scene_map[kSCENE_B] = SceneB;
while(1) scene = scene_map[scene]();
}
但我想知道在 C 中是否可以用这种方式或类似的方式编写代码:
SomeType RenderSceneA();
SomeType RenderSceneB();
int main() {
SomeType scene = RenderSceneA;
while(1) scene = scene();
}
那么 SomeType 应该是什么类型,或者我只能使用void * 吗?如果后者是真的,我怎样才能写出比第二个代码块更清晰的代码?
【问题讨论】:
-
AFAICR,你不能在(标准 C)中这样做。我似乎记得在 90 年代曾在这个问题上花费时间,但从那以后没有任何重大变化会影响这一点。
x必须是函数指针;它必须是指向函数的指针,该函数返回指向函数的指针。这很快就会变得很棘手——请参阅signal()以获取此类函数的示例。请注意,signal()不会返回指向其自身类型的指针。 -
@JonathanLeffler 我似乎记得早在 90 年代就在这个问题上花费了时间,但从那时起没有任何重大变化会影响 C++ 成功的原因之一。顺便说一句,我并不真的对多态性过敏
-
@0___________ 如果这在 C++ 中是可能的,那么代码应该如何?我学到了一些关于
std::function的知识,但它似乎对此没有帮助。我试过using SomeType = std::function<SomeType()>;,但它当然不能编译。