在可变参数预处理器类函数宏中实现与 __VA_OPT__ 相反的效果[关闭]

问题描述 投票:0回答:1

如果没有可变参数,如何实现与 VA_OPT 相反的效果,仅扩展。

c++ preprocessor variadic
1个回答
0
投票

您可以非常轻松地构建一个小的条件扩展宏,以便

VALUE_IF(1, args)
扩展为
args
VALUE_IF(0, args)
(或者在本例中也是
VALUE_IF(, args)
)扩展为空:

#define VALUE_IF_TEST(...)
#define VALUE_IF_TEST0(...)
#define VALUE_IF_TEST1(...) __VA_ARGS__
#define VALUE_IF(COND, ...) VALUE_IF_TEST ## COND ( __VA_ARGS__ )

然后你的“与

__VA_OPT__
相反”宏看起来像
VALUE_IF(__VA_OPT__(1), value)
。如果有可变参数,这将扩展为
VALUE_IF(1, value)
value
;如果没有,则扩展为
VALUE_IF(, value)
 
(无)。

例如https://godbolt.org/z/n51jMvac5

#define TEST(...) VALUE_IF(__VA_OPT__(1), std::printf("TEST expanded on line %d with args %s\n", __LINE__, #__VA_ARGS__); )

int main() {
    TEST()      // (no output on line 11)
    TEST(1)     // TEST expanded on line 12 with args 1
    TEST(1, 2)  // TEST expanded on line 13 with args 1, 2
}
© www.soinside.com 2019 - 2024. All rights reserved.