gpt4 book ai didi

c++ - 如何调用包含参数集的笛卡尔积中所有点的宏?

转载 作者:太空狗 更新时间:2023-10-29 20:53:07 28 4
gpt4 key购买 nike

假设我有一个宏

FOO(a, b)

我想用 a 的一组特定(固定)可能值来调用这个宏;以及 b 的一组固定值。因此,如果我的 b 值集是 barbaz 而我的 b 值集是 fizbang , 我想要:

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__ 分成两个不同的集合并迭代这些集合中元素对的二维空间似乎是不可能/棘手的。

这可以(合理地)完成吗?

注意事项:

  • 我对基于 C 预处理器的解决方案很感兴趣,但如果出于某种奇怪的原因您有一些只能在 C++ 中运行的解决方案,那也没关系。
  • 解决方案必须仅在编译时有效,并且在您的 C/C++ 翻译单元中的大部分地方都有效;具体来说,在类定义和文件范围内。
  • 你可能会猜这是一个 XY problem ,你是对的;但请不要批评我的动机,因为恕我直言,X 和 Y 都很有趣。
  • 如果您可以维护宏调用的字典顺序,那就太好了。

最佳答案

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com