Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于调用宏中具有两个或多个参数的每个宏 这里是一些C++宏代码,它模拟循环以消除复制和粘贴代码。 #define SEMICOLON ; #define LOL(x) print(x) #define LOLZ(...) FOR_EACH(LOL, SEMICOLON, ##__VA_ARGS__) LOLZ("hi", "my", "friend", "!"); // result print("hi"); print("my"); print("friend"); print("!");_C++_Foreach_Macros_C Preprocessor_Substitution - Fatal编程技术网

对于调用宏中具有两个或多个参数的每个宏 这里是一些C++宏代码,它模拟循环以消除复制和粘贴代码。 #define SEMICOLON ; #define LOL(x) print(x) #define LOLZ(...) FOR_EACH(LOL, SEMICOLON, ##__VA_ARGS__) LOLZ("hi", "my", "friend", "!"); // result print("hi"); print("my"); print("friend"); print("!");

对于调用宏中具有两个或多个参数的每个宏 这里是一些C++宏代码,它模拟循环以消除复制和粘贴代码。 #define SEMICOLON ; #define LOL(x) print(x) #define LOLZ(...) FOR_EACH(LOL, SEMICOLON, ##__VA_ARGS__) LOLZ("hi", "my", "friend", "!"); // result print("hi"); print("my"); print("friend"); print("!");,c++,foreach,macros,c-preprocessor,substitution,C++,Foreach,Macros,C Preprocessor,Substitution,我还可以展示创建这个宏的代码(我发现了这个): 但我很难理解函数的两个参数: 我需要在这个宏的一次迭代中使用func(x,y)。 调用宏必须如下所示: MY_DUAL_FOREACH_LIKE_MACRO( x1, y1, x2, y2, x3, y3 ) // and I expect to get: func(x1, y1); func(x2, y2); func(x3, y3); 如果我在宏的“x”参数附近添加“y”,我将得到调用“what”参数的x2个未编码替换: fu

我还可以展示创建这个宏的代码(我发现了这个):

但我很难理解函数的两个参数: 我需要在这个宏的一次迭代中使用func(x,y)。 调用宏必须如下所示:

MY_DUAL_FOREACH_LIKE_MACRO(
  x1, y1,
  x2, y2,
  x3, y3
)

// and I expect to get:
func(x1, y1); func(x2, y2); func(x3, y3); 
如果我在宏的“x”参数附近添加“y”,我将得到调用“what”参数的x2个未编码替换:

func(x1, y1); func(x2, y2); func(x3, y3); func(, ); func(, ); func(, ); 

如果您有这方面的经验,请帮助我将此宏重新编码为每个宏的双参数类型

如果用括号将宏参数分组,则每个分组将作为一个参数处理。您可能会修改宏,以便可以这样调用它:

MY_DUAL_FOREACH_LIKE_MACRO(
  (x1, y1),
  (x2, y2),
  (x3, y3)
)

然后让宏粘贴
func
(x1,y1)

通常,我赞成回答前面提到的问题,假设选择解决方案是有原因的。但我对二十一世纪的C++中宏的使用有很强的看法,所以无论如何我都把它作为答案。
请,请,请不要这样滥用宏

如果您想使用成对的参数调用函数,下面是一个完全可以接受、可读、可调试、可维护的解决方案,无需宏:

std::vector<std::pair<double, double>> values = {
    { x1, y1 },
    { x2, y2 },
    { x3, y3 }
};

for(auto& pair : values)
{
    f(pair.first, pair.second);
}
std::向量值={
{x1,y1},
{x2,y2},
{x3,y3}
};
用于(自动配对:值(&P)
{
f(第一对,第二对);
}
如果您愿意,也可以将它们放在一个向量中:

std::vector<double> values = {
    x1, y1,
    x2, y2,
    x3, y3
};

for(int i = 0; i < values.size(); i += 2)
{
    f(values[i], values[i + 1]);
}
std::向量值={
x1,y1,
x2,y2,
x3,y3
};
对于(int i=0;i
根据我更好的判断,我将回答这个问题(因为它在一些罕见的情况下很有用)。我修改了您发布的代码,因此它需要两个参数():

如果您想调用
foo
超过3次,您必须添加额外的案例,这将作为练习留给读者

这是可以清理的,并且可能应该为每个指定一个不同于
的名称(可能类似于
FOR _EACH_2
,以指示它一次操作两个参数),这将作为另一个练习留给读者


我把事情留给读者做练习的原因是不鼓励使用这个答案(但不是完全阻止它)。如果您不想费心清理这些内容并根据您的需要进行调整,那么这就由您来承担。

我真的不建议您这样做。你想解决什么问题?你能通过在一个结构中表示你的数据然后在上面迭代来解决它吗?宏是邪恶的。我希望我永远不会调试这样的代码。顺便说一句,这种“双重”迭代称为zip迭代器,可以在boost库中找到。当您有标准函数时,为什么要使用宏,或者“这是一种很酷的方法,可以消除复制和粘贴代码。”为此,我们有函数!!!不,这绝对不酷。虽然我不喜欢宏方法,但一个优点是它不需要分配/取消分配任何内存。谢谢你的回答,我理解滥用宏。我需要自动化一些过程。这不仅仅是调用函数。这也是类型定义和方法声明。我工作的框架这是使用它的好理由。@Broly这样说,它不是您需要的宏,而是template@Cornstalks:您可以用
std::initializer\u list
array
替换
std::vector
,以避免分配。@Broly您所做的在C(以及某种程度上在C++03)中是一种有用的技术,但在最近的C++版本中,宏由于模板而变得无用。谢谢你的回答,我会试试看:谢谢!我几乎猜到了!但是哪个圆括号呢?(什么((x),(y))@Broly:。有关更多详细信息,请参阅。
std::vector<double> values = {
    x1, y1,
    x2, y2,
    x3, y3
};

for(int i = 0; i < values.size(); i += 2)
{
    f(values[i], values[i + 1]);
}
#include <iostream>

#define EXPAND(x) x
#define FOR_EACH_2(what, delimiter, x, y) what((x), (y))
#define FOR_EACH_4(what, delimiter, x, y, ...)\
  what((x), (y)) delimiter \
  EXPAND(FOR_EACH_2(what, delimiter, __VA_ARGS__))
#define FOR_EACH_6(what, delimiter, x, y, ...)\
  what((x), (y)) delimiter \
  EXPAND(FOR_EACH_4(what, delimiter, __VA_ARGS__))

#define FOR_EACH_NARG(...) FOR_EACH_NARG_(__VA_ARGS__, FOR_EACH_RSEQ_N())
#define FOR_EACH_NARG_(...) EXPAND(FOR_EACH_ARG_N(__VA_ARGS__))
#define FOR_EACH_ARG_N(_1, _2, _3, _4, _5, _6, N, ...) N
#define FOR_EACH_RSEQ_N() 6, 5, 4, 3, 2, 1, 0
#define CONCATENATE(x,y) x##y
#define FOR_EACH_(N, what, delimiter, ...) EXPAND(CONCATENATE(FOR_EACH_, N)(what, delimiter, __VA_ARGS__))

#define FOR_EACH(what, delimiter, ...) FOR_EACH_(FOR_EACH_NARG(__VA_ARGS__), what, delimiter, __VA_ARGS__)

void foo(int x, float y) {
    std::cout << "foo(" << x << ", " << y << ")\n";
}

int main() {
    FOR_EACH(foo, ;, 1, 3.14, 2, 1.41, 3, 1.73);
}
foo(1, 3.14)
foo(2, 1.41)
foo(3, 1.73)