如何使用boost::预处理器来解压缩序列
How to use boost::preprocessor to unzip a sequence?
如何使用boost::预处理器来解压缩对序列?
例如,我有一个序列如下(逗号之间无关紧要)
(int,x)(double,y)(float,z) or
(int,x),(double,y),(float,z) or
((int)(x))((double)(y))((float)(z))
并希望转换为
int,double,float
和
x,y,z
通过使用类似macor的
UNZIP(i, seq)
其中CCD_ 1是索引。
(int, x, 10)(double, y, 20)(float, z, 30)
的解压缩,即元素之间不带逗号的序列。
现场演示
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/seq/pop_front.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/preprocessor/cat.hpp>
// Such technique is used at:
// http://www.boost.org/doc/libs/1_56_0/boost/fusion/adapted/struct/define_struct.hpp
#define AUXILIARY_0(...) ((__VA_ARGS__)) AUXILIARY_1
#define AUXILIARY_1(...) ((__VA_ARGS__)) AUXILIARY_0
#define AUXILIARY_0_END
#define AUXILIARY_1_END
#define REMOVE_PARENTHESES(...) __VA_ARGS__
#define COMMA_SEPARATED(r, data, i, elem)
BOOST_PP_COMMA_IF(i) BOOST_PP_VARIADIC_ELEM(data, REMOVE_PARENTHESES elem)
/**/
#define ZIPPED_TO_SEQ(zipped)
BOOST_PP_SEQ_POP_FRONT(BOOST_PP_CAT(AUXILIARY_0(0)zipped,_END))
/**/
#define FOR_EACH_ZIPPED_I(macro, data, zipped)
BOOST_PP_SEQ_FOR_EACH_I(macro, data, ZIPPED_TO_SEQ(zipped))
/**/
#define UNZIP(i, zipped) FOR_EACH_ZIPPED_I(COMMA_SEPARATED, i, zipped)
/*******************************************************************/
// DEMO:
#define zipped (int, x, 10)(double, y, 20)(float, z, 30)
FIRST: UNZIP(0, zipped)
SECOND: UNZIP(1, zipped)
THIRD: UNZIP(2, zipped)
预处理器输出:
FIRST: int , double , float
SECOND: x , y , z
THIRD: 10 , 20 , 30
假设你指的是逗号((int,x),(double,y),(float,z)
),Boost.PP效果很好:
#include <boost/preprocessor.hpp> //or smaller individual headers
//SEQ_ENUM adds commas between each element of the sequence
//the sequence is transformed from what's passed into the ...
//the invocation of UNZIP_MACRO is given the index to use in each element as data
#define UNZIP(i, ...)
BOOST_PP_SEQ_ENUM(
BOOST_PP_SEQ_TRANSFORM(
UNZIP_MACRO,
i,
BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)
)
)
//called with each element of the sequence
#define UNZIP_MACRO(s, data, elem)
BOOST_PP_TUPLE_ELEM(data, elem)
#define ZIPPED_SEQUENCE (int,x),(double,y),(float,z)
UNZIP(0, ZIPPED_SEQUENCE) //int, double, float
UNZIP(1, ZIPPED_SEQUENCE) //x, y, z
相关文章:
- 使用C++进行运行长度解压缩
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++ 如何将数组值解压缩为函数参数
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 在 Qt(C++) 中使用 QProcess 解压缩 - 提取目录问题
- 浏览压缩文件与游览解压缩它们
- 如何在C++向量中解压缩多个值
- C++预处理会生成变量成员、资源库和映射
- 解压缩 C 样式数组以及C++中的参数包
- 如何在 cpp 中解压缩数字,如果它们是使用 struct.pack(fmt, v1, v2, ..) 打包在 pyth
- 使用预处理指令检查是否包含标头?
- 如何使用 Poco::ZIP 压缩/解压缩 zip 文件
- 预处理的 C/C++ 文件是否特定于计算机?
- 在编译时解压缩数组扩展数据块 (C++11/14)
- 使用 RtMidi 解压缩 Midi 时间码
- 将参数包解压缩到 std::initializer_list?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 解压缩可变模板参数
- 解压缩附加的压缩字符串
- 如何使用boost::预处理器来解压缩序列