gpt4 book ai didi

c++ - 收集稍后应在宏中调用的函数列表

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:00 25 4
gpt4 key购买 nike

我正在编写一个小型库,使用它可以更轻松地使用 C++ 中的枚举。语法类似于:

ENUM_START(MyEnum)
ENUM_VAL(Val1)
ENUM_VAL(Val2)
...
ENUM_END

这个宏创建一个 MyEnum 类,允许例如以下访问:

MyEnum bla=MyEnum::Val1;
for(MyEnum::iterator iter=MyEnum::begin();iter!=MyEnum::end();++iter)
cout << iter->toString();

还有一些其他功能,例如将附加数据(例如字符串)存储到枚举值。

宏已完成并可以运行,但不像上面所示那样易于定义。为此,我需要一种方法来创建一个带有 ENUM_VAL 宏的初始化函数列表,我稍后可以调用这些宏。类似于以下 boost::mpl 方法:

typedef mpl::vector<> list__COUNTER__;
#define ENUM_VAL(Name) \
... \
struct Init##Name{void init() {initialization code}}; \
typedef mpl::push_back< \
list##(__COUNTER-1), \
Init##Name \
>::type list##__COUNTER__; \

这样 list##(__COUNTER__-1) 最后包含 Init##Name 类型,最后我可以使用 mpl foreach 对所有存储类型调用 init()。

现在的问题是命名。我必须在每个宏实例化中使用 __COUNTER__ 两次,这会使计数器递增两次。我已经搜索并发现了

  • C 预处理器在命名变量时不计算 (__COUNTER__-1)
  • 如果不增加 __COUNTER__ 就无法读取它。

所以我需要另一种方法来收集我以后可以调用的函数列表。

最佳答案

你可以使用 Boost.Preprocessor特别是 sequences .这将导致类似于这样的宏用法:

MAKE_ENUM(MyEnum, (Val1)(Val2)(Val3))

使用SEQ_ENUMSEQ_FOR_EACH_I 等,您可以相对轻松地生成代码。

还有一个提议 Boost.Enum这可能已经满足您的需求。

关于c++ - 收集稍后应在宏中调用的函数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8931995/

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