gpt4 book ai didi

c++ - X 宏中元素的条件定义

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:32 28 4
gpt4 key购买 nike

假设我有一个 X Macro对于定义如下的项目列表:

#define X_MACRO(FN) \
FN(foo) \
FN(bar) \
FN(zip)

这很好用,我可以调用它来为每个元素生成相同的模板化代码,例如:

#define xstr(s) str(s)
#define str(s) #s
#define PRINT_X(E) void print_ ## E () { std::cout << str(E); };
X_MACRO(PRINT_X)

这会生成类似于 void print_foo() { std::cout << "foo"; }; 的函数对于每个 X_MACRO 元素。到目前为止,还不错。

但是,现在我希望 X 宏元素的列表以预处理器宏为条件。例如 zip如果 USE_ZIP 元素应该只包含在 X 宏中被定义为。当然,我不能放 #ifdef在 X 宏中,例如:

#define X_MACRO(FN) \
FN(foo) \
FN(bar) \
#ifdef USE_ZIP
FN(zip)
#endif

我可以将列表写两次,一次是 zip一旦没有,基于 USE_ZIP像这样:

#ifdef USE_ZIP
#define X_MACRO(FN) \
FN(foo) \
FN(bar) \
FN(zip)
#else
#define X_MACRO(FN) \
FN(foo) \
FN(bar)
#endif

...但这违反了 DRY,更重要的是,如果您需要有条件地包含其他元素,它会迅速失控,这将需要列出 USE_* 的每个可能组合。宏。

我怎样才能以合理的方式做到这一点?

最佳答案

一种方法是以base 样式拆分事物并从 super 宏调用它(我不知道它们是否有特殊名称):

#define X_MACRO_BASE(fn) \
fn(foo) \
fn(bar) \

#if USE_ZIP

#define X_MACRO(fn) \
X_MACRO_BASE(fn) \
fn(zip)

#else

#define X_MACRO(fn) \
X_MACRO_BASE(fn)

#endif

它并不完美,但它仍然可能有用:-)


另一个巧妙的技巧是有一个简单的条件宏(假设 USE_ZIP01):

#define IF(cond, foo) IF_IMPL(cond, foo)
#define IF_IMPL(cond, foo) IF_ ## cond (foo)
#define IF_0(foo)
#define IF_1(foo) foo

然后你可以说:

#define X_MACRO(fn) \
fn(foo) \
fn(bar) \
IF(USE_ZIP, fn(zip))

关于c++ - X 宏中元素的条件定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46019370/

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