作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 BOOST_PP
我可以将一个宏扩展为多个逗号分隔值和一个附加标记,如下面的代码所示。
但是,它在无参数情况下不起作用。
#define BOOST_PP_VARIADICS
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#define ADD_TOKEN(r, token, i, e) \
BOOST_PP_COMMA_IF(i) token(e)
#define WRAP(...) \
BOOST_PP_SEQ_FOR_EACH_I(ADD_TOKEN, decltype, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))
#define MACRO(fmt, ...) \
Template<WRAP(__VA_ARGS__)>
MACRO("");
MACRO("", 0);
MACRO("", 0, 1);
用gcc -E main.cpp
编译时的输出是
Template< decltype() >;
Template< decltype(0) >;
Template< decltype(0) , decltype(1) >;
如何在没有 __VA_ARGS__
参数的情况下调用 MACRO
扩展为 null?
也就是说,我希望输出为:
Template< >;
Template< decltype(0) >;
Template< decltype(0) , decltype(1) >;
我怎样才能做到这一点?
最佳答案
这个答案使用了 GNU 扩展。您在评论中表示对此没有意见。
您可以使用 BOOST_PP_TUPLE_SIZE((, ## __VA_ARGS__))
:当且仅当可变参数被省略时,它会给您 1
。
模板有点棘手,因为它们可以包含未加括号的逗号,这在宏参数中使用时会造成混淆。以 WRAP
宏仅在 BOOST_PP_IF
完成后展开的方式编写它需要一些工作:
#define MACRO(fmt, ...) \
Template< \
BOOST_PP_IF(BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE((,##__VA_ARGS__)), 1), \
BOOST_PP_EXPAND, WRAP) (__VA_ARGS__) \
>
注意:我在空的情况下使用 BOOST_PP_EXPAND
,因为 BOOST_PP_EXPAND(__VA_ARGS__)
将展开为空。
关于c++ - BOOST_PP 在空序列情况下扩展序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29227073/
使用 BOOST_PP 我可以将一个宏扩展为多个逗号分隔值和一个附加标记,如下面的代码所示。 但是,它在无参数情况下不起作用。 #define BOOST_PP_VARIADICS #include
我是一名优秀的程序员,十分优秀!