[英]Can you cast a void pointer to a struct to a specific struct type at runtime?
我有一个像这样定义的结构:
struct GameState {
int score;
int moves;
bool won;
void *metadata;
};
typedef struct GameState GameState;
元数据指针将指向运行时确定的另一种类型的结构。 例如,它可能是:
struct KlondikeMetadata{
bool draw3;
int drawcount;
};
typedef struct KlondikeMetadata KlondikeMetadata;
或者可能:
struct FreeCellMetadata{
int reserveCells;
};
typedef struct FreeCellMetadata FreeCellMetadata;
使用的实际元数据结构取决于用户正在玩的游戏。 99%的时间这不是问题,因为我知道用户正在玩什么游戏。 但是,在某些情况下我不知道(也不知道)。
我的问题是,有没有办法在运行时确定或指定正确的元数据类型?
例如,如果我可以向GameState结构添加一个属性,以指示元数据值是KlondikeMetadata类型,并使用该属性将元数据转换为该类型,我想我会很高兴。 有没有办法做到这一点? 有没有一种方法可以在C中运行时指定类型并强制转换变量?
您将需要自己对其进行编码。
最简单的解决方案是声明枚举:
typedef enum {
GameType_Klondike,
GameType_FreeCell,
} GameType;
然后在指针前添加该类型的字段:
GameType game_type;
void *metadata;
当然,这意味着您在初始化metadata
时必须设置 game_type
字段,以记住类型。
您还可以有点面向对象,并将GameType
包含在元数据中:
struct Metadata {
GameType gametype;
};
struct FreeCellMetadata {
struct Metadata meta;
/* rest of fields here */
};
struct KlondikeMetadata {
struct Metadata meta;
/* rest of fields here */
};
然后,您可以将void *
为struct Metadata *
,并在将指针转换为正确类型之前检查gametype
字段。
对于奖励积分,请使用联盟:
struct Metadata {
GameType type;
union {
struct KlondikeMetadata klondike;
struct FreecellMetadata freecellL;
} game;
};
同样,当然,这需要您维护数据,即,在初始化struct KlondikeMetadata
,必须记住设置其gametype
字段,依此类推。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.