繁体   English   中英

您可以在运行时将指向结构的void指针转换为特定的结构类型吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM