如何展开BOOST_PP_IF中包含逗号的宏
How do I expand a macro containing commas inside a BOOST_PP_IF
我早些时候问了以下问题,但解决方案似乎在这种特殊情况下不起作用。
如何使用Boost预处理器多次打印逗号
我正在尝试有条件地展开包含逗号的宏。下面是一个说明问题的例子:
#define TEST(...)
BOOST_PP_REPEAT(
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),
MACRO,
BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))
#define MACRO(z, n, data) BOOST_PP_IF(1,MACRO_CONTAINING_COMMA(z, z),MACRO_CONTAINING_COMMA(z, z))
#define MACRO_CONTAINING_COMMA(_NAME, _NAME2) _NAME TIBRA_EATEN_COMMA() _NAME2
#define EATEN_COMMA BOOST_PP_IF(1,BOOST_PP_COMMA,BOOST_PP_TUPLE_EAT())
TEST(1,2,3,4)
这扩展到
BOOST_PP_IIF
何时应扩展到
0,0,1,2,3,3
您可以通过先选择宏然后调用它来延迟调用宏:
#define TEST(...)
BOOST_PP_REPEAT(
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),
MACRO,
BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))
#define MACRO(z, n, data) BOOST_PP_IF(1,MACRO_CONTAINING_COMMA,MACRO_CONTAINING_COMMA)(n, n)
#define MACRO_CONTAINING_COMMA(_NAME, _NAME2) _NAME EATEN_COMMA _NAME2
#define EATEN_COMMA BOOST_PP_IF(1,BOOST_PP_COMMA,BOOST_PP_TUPLE_EAT())()
查看它的工作
IF
调用扩展到没有调用的宏,或者在调用时丢弃参数的宏。选择一个后,最后一个圆括号会用所需的参数调用它,而逗号不会妨碍它。
除此之外,我将z
更改为n
,将TIBRA_EATEN_COMMA()
更改为EATEN_COMMA
。由于有些部分是多余的,您可以在这里找到一个更简单的版本。
事实证明,您可以在没有__VA_ARGS__
的情况下做到这一点。在这个简单的例子中,我在函数toString<int,int>()
的模板参数中使用了一个逗号工作演示:
#include <boost/lexical_cast.hpp>
#include <boost/preprocessor.hpp>
#include <iostream>
#include <string>
#define SEQUENCE (1)(2)(3)(4)(5)(6)(7)(8)(9)(10)
#define IGNORE_ARG(arg)
#define GET_NAME(data) BOOST_PP_SEQ_ELEM(0, data)
#define GET_BELOW(data) BOOST_PP_SEQ_ELEM(1, data)
#define PARSE_SEQUENCE(r, data, elem)
BOOST_PP_IF(
BOOST_PP_GREATER_EQUAL(elem, GET_BELOW(data)),
GET_NAME(data), IGNORE_ARG)
(elem)
#define SKIP_NUMBERS_BELOW(name, below)
BOOST_PP_SEQ_FOR_EACH(PARSE_SEQUENCE, (name)(below), SEQUENCE)
#define TEST(name) SKIP_NUMBERS_BELOW(name, 4)
#define MACRO_CONTAINING_COMMA(N) toString<N, 2 * N>() <<
template <int a, int b> // whatever, I just need a comma here.
std::string toString() {
return boost::lexical_cast<std::string>(a) + ":" + boost::lexical_cast<std::string>(b) + " ";
}
int main() {
std::cout << TEST(MACRO_CONTAINING_COMMA) "n";
}
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- 尝试使用 indexOf 创建一个 if 语句来检查字符串是否包含字符.有一点麻烦
- 无法编译包含"if constexpr"的函数模板实例化
- c++程序是否可以在if/else语句中包含switch语句
- #if 条件区域是否可以跨越包含文件边界
- C++Bare布尔表达式(不包含if、while或其他语句)
- Do..While循环可能带有if..else语句中包含临时变量
- 与c++中包含数组的if ledder混淆
- IF语句中包含多个条件
- C++11 条件包含控制表达"types act as if same representation as" ?
- 任何C++编译器都要删除在内联时总是包含相同答案的if语句
- 在C语言中,如果if语句包含赋值语句,是否会更快?