如何使用Boost预处理器多次打印出逗号
How do I print out a comma multiple times using Boost Preprocessor
我需要使用可变宏来扩展到一个类的多个变体。由于它们需要根据宏输入具有不同的名称,所以我不能简单地使用模板。问题是我无法展开逗号(,
)符号,并且我的类具有接受多个参数的函数(为此我需要使用逗号符号)。
boost
提供了扩展为逗号的BOOST_PP_COMMA()
宏,但它只在循环构造之外工作。我猜问题是BOOST_PP_COMMA()
展开一次,然后作为逗号处理,此时程序中断。
为了说明这个问题,假设我有一个宏函数,它接受可变数量的参数,并产生与给定参数数量相等的逗号。简单的解决方案是:
#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,BOOST_PP_COMMA(),BOOST_PP_COMMA())
但是这会产生一系列错误,因为逗号被展开了,宏认为它们是分隔参数。
有办法解决这个问题吗?
使用BOOST_PP_REPEAT
和一个可以用预期参数调用的宏将工作得很好,它甚至可以防止需要BOOST_PP_COMMA
:
#define PRINT_COMMAS(...)
BOOST_PP_REPEAT(
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),
PRINT_COMMAS_MACRO,
BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))
#define PRINT_COMMAS_MACRO(z, n, data) ,
看效果
为了节省额外的宏,您可以利用BOOST_PP_ENUM
在展开之间添加逗号的事实,通过在重复次数上添加1并使用BOOST_PP_TUPLE_EAT
丢弃宏参数:
#define PRINT_COMMAS(...)
BOOST_PP_ENUM(
BOOST_PP_INC(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)),
BOOST_PP_TUPLE_EAT(),
BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__))
看效果
相关文章:
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 如何使用gdb制作一个可以漂亮地打印每个对象的C++函数
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- 如何使用递归打印修改后的星号三角形图案
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何使用 std::variant 打印地图键/值?
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- 访问和打印元组中的数据,并使用 C++14 使用模板函数显示数据
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 使用递归 c++ 打印模式
- 在 c++ 中对字符串使用复制函数时打印的垃圾值
- 如何在逗号后使用 cout 打印整数值,而无需在逗号后添加额外的零C++?
- 我的C++程序如何访问计算机的日期和时间以打印和使用当前年份?
- 如何打印 ;符号使用 CMake 命令
- 打印出使用地图实现的Trie中的所有单词
- 你如何打印出使用数组删除某些字符的回文
- 将卡片的矢量传递到函数中进行打印和使用
- 打印在使用%.22f时改变的值