boost 中 for_each.hpp 学习笔记
boost 中 for_each.hpp 学习笔记
boost 中 for_each.hpp 学习笔记
文章地址
https://www.lucien.ink
引入
Linux 需要 install 一下 libboost-dev 这个库,macOS 没有测,Windows 日常不在考虑范围内。
BOOST_PP_SEQ_FOR_EACH 宏包含于 boost/preprocessor/seq/for_each.hpp 中。
用法
BOOST_PP_SEQ_FOR_EACH(func, data, seq) ,其中:
func为自己定义的一个宏data为一个常量seq为一个序列
这个宏会将序列中的参数依次按照指定的宏 func 展开。
例子
https://pasteme.cn/2714
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## include <bits/stdc++.h>
## include <boost/preprocessor/seq/for_each.hpp>
## define seq (a)(b)(c)
## define func(r, data, elem) printf("%d %d %d\n", r, data, elem);
## define seq_ (a, 2)(b, 1008)(c, 100) // this is not correct, using STL instead.
int main() {
int a = 1, b = 2, c = 3, d = 4;
## define a d
BOOST_PP_SEQ_FOR_EACH(func, 1008611, seq)
/*
* expand to:
* printf("%d %d %d\n", r, data, a);
* printf("%d %d %d\n", r, data, b);
* printf("%d %d %d\n", r, data, c);
* for every element in macro seq will replace the elem in func.
*/
return 0;
}
输出结果为:
1
2
3
2 1008611 4
3 1008611 2
4 1008611 3
行为分析
在代码里我有注释一些,比较值得注意的就是代码中第 9 行的 trick ,再就是 seq 只能定义为单个变量,不能视作完全的宏定义。
至于 r 的值为什么从 $2$ 开始,看了一下源代码,好像是指向 seq 中的下一个位置?
如有不对烦请指正。
This post is licensed under CC BY 4.0 by the author.