作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有一个宏
FOO(a, b)
我想用 a
的一组特定(固定)可能值来调用这个宏;以及 b
的一组固定值。因此,如果我的 b 值集是 bar
和 baz
而我的 b 值集是 fiz
和 bang
, 我想要:
FOO(bar, fiz)
FOO(bar, bang)
FOO(baz, fiz)
FOO(baz, bang)
由换行符或分号分隔,或两者兼而有之 - 这是一个小问题,所以让我们忽略它; 4 次调用的确切顺序也不重要。
现在,如果我只有一个“维度”的参数,我可以使用 William Swanson 的 mechanism (如网站上的此处所述;甚至还有一个 github repository),然后写
MAP(SINGLE_PARAMETER_MACRO, bar, baz, quux)
获得
SINGLE_PARAMETER_MACRO(bar)
SINGLE_PARAMETER_MACRO(baz)
SINGLE_PARAMETER_MACRO(quux)
但问题是,我有两个维度;将您的 __VA_ARGS__
分成两个不同的集合并迭代这些集合中元素对的二维空间似乎是不可能/棘手的。
这可以(合理地)完成吗?
注意事项:
最佳答案
BOOST_REPEAT_PP
可以帮助你。
例如,如果你有两个数字数组,你可以在 c++14 中这样做:
#include <boost/preprocessor/repetition/repeat.hpp>
#include <array>
#include <iostream>
constexpr std::array<int, 2> a = {2, 4};
constexpr std::array<int, 3> b = {1, 3, 7};
#define MYNUMBER2(z, n, x) std::cout << a[x] << " " << b[n] << std::endl;
#define MYNUMBER(z, n, x) BOOST_PP_REPEAT(3, MYNUMBER2, n)
int main() {
BOOST_PP_REPEAT(2, MYNUMBER, 0); // The "0" is actually not used
}
输出:
2 1
2 3
2 7
4 1
4 3
4 7
如果您不想使用 std::array
,您也可以采用如下方法(不需要 c++14):
#include <boost/preprocessor/repetition/repeat.hpp>
#include <iostream>
#define A_0 "bar"
#define A_1 "baz"
#define A_2 "ban"
#define B_0 "fiz"
#define B_1 "bang"
#define FOO(s1, s2) std::cout << s1 << " " << s2 << std::endl;
#define MYSTRING2(z, n, x) FOO(A_##x, B_##n)
#define MYSTRING(z, n, x) BOOST_PP_REPEAT(2, MYSTRING2, n)
int main() {
BOOST_PP_REPEAT(3, MYSTRING, 0); // The "0" is actually not used
}
输出:
bar fiz
bar bang
baz fiz
baz bang
ban fiz
ban bang
关于c++ - 如何调用包含参数集的笛卡尔积中所有点的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43722897/
我是一名优秀的程序员,十分优秀!