gpt4 book ai didi

c++ - 在编译时动态生成结构

转载 作者:太空狗 更新时间:2023-10-29 23:41:25 26 4
gpt4 key购买 nike

我必须生成一个仅在特定条件下包含特定字段的数据结构。这通常总是转化为如下内容

struct MyStruct {
int alwaysHere;

#ifdef WHATEVER
bool mightBeHere;
#endif

char somethingElse;

#if SOME_CONSTANT > SOME_VALUE
uint8_t alywasHereButDifferentSize;
#else
uint16_t alywasHereButDifferentSize;
#endif
...
};

在我看来,这很容易变得难看,而且难以阅读。甚至不谈论处理这些字段的代码,通常在ifdefs 也是。

我正在寻找一种优雅的方式来实现相同的结果,而不会增加任何开销,但需要大量代码更具可读性。模板特化似乎有点过分,但在我看来成为唯一的选择。

C++11 是否添加了任何东西来处理这种情况?

如有任何建议,我们将不胜感激。

最佳答案

对于第二种情况,我通常更喜欢将 hackery 限制在一个地方的 typedef:

#if SOME_CONSTANT > SOME_VALUE
typedef uint8_t always_type;
#else
typedef uint16_t always_type;
#endif

然后您的其余代码将始终使用 always_type:

struct MyStruct {
// ...
always_type always_here_but_different_size;
// ...
};

如果你想使用:

typedef std::conditional<(SOME_CONSTANT > VALUE), uint8_t, uint16_t>::type always_type;

这也很好——这里的重点不是你用来获取所需类型的语法,而是你通常想为该类型创建一个名称以便你可以在需要的地方使用它这一事实。

至于有无的情况,有点不好说。通常,这样的事情将与在构建时启用/禁用某些功能有关。如果是这样,则该类似乎具有与可以启用/禁用的功能相关的职责,以及与其他功能相关的职责。这听起来可能违反了单一职责原则,并且可能不是很有凝聚力。如果是这种情况,则可能表明在整体设计级别上可以更好地解决问题,而不仅仅是您使用的语法。

警告:我可能从公认的最少证据中推断了很多——可能比证据真正支持的要多。

关于c++ - 在编译时动态生成结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com