是否可以在 C++ 中使用宏交换两个变量的出现?
Is it possible to swap the occurences of two variables using macros in C++?
我正在研究一个竞赛问题,我必须按以下方式初始化一个向量:
vector<pair<int,int>> moves({{i,j}, {i,-j}, {-i,j}, {-i,-j},
{j,i}, {j,-i}, {-j,i}, {-j,-i}});
虽然我知道这不是最好的方法并且我知道有很多不同的方法可以用最少的努力完成这个,但我想知道是否有 C++ 宏允许我简单地复制粘贴第一个上面vector的四个元素通过以下方式实现相同:
vector<pair<int,int>> moves({{i,j}, {i,-j}, {-i,j}, {-i,-j},
#define i j
#define j i
{i,j}, {i,-j}, {-i,j}, {-i,-j}
#undef i
#undef j
});
由于变量的循环引用,上面的代码显然不起作用。
P.S。 : 尽管 Matteo Italia 的回答在上述上下文中是绝对正确的,但我更想知道在 C++ 中是否可以使用宏交换变量的出现,以及如果可能的话如何交换?
如果您真的认为这样很节省,您可以使用函数式宏并调用它两次,交换其参数。
#define SIGN_COMB(a, b) {(a), (b)}, {(a), -(b)}, {-(a), (b)}, {-(a), -(b)}
vector<pair<int,int>> moves({SIGN_COMB(i, j), SIGN_COMB(j, i)})
宏扩展中的括号通常是为了避免表达式作为参数传递时出现意外情况(如果传入一个表达式,例如 x+y
,则否定项将是 -x+y
而不是 -(x+y)
).
宏是邪恶的,在这种情况下不是一个好主意。然而,由于这似乎是众所周知的,而且这个问题更具有学术性质:认为 "define" 而不是 "swap"。您既不能使用“i
”也不能使用“j
”作为宏的名称,因为您希望两者都出现在已处理的代码中。因此,为您的宏引入两个新的标识符。更新前四个元素以使用新标识符后,您可以按要求复制并粘贴它们。
vector<pair<int,int>> moves({
#define a i
#define b j
{a,b}, {a,-b}, {-a,b}, {-a,-b},
#undef a
#undef b
#define a j
#define b i
{a,b}, {a,-b}, {-a,b}, {-a,-b}
#undef a
#undef b
});
我正在研究一个竞赛问题,我必须按以下方式初始化一个向量:
vector<pair<int,int>> moves({{i,j}, {i,-j}, {-i,j}, {-i,-j},
{j,i}, {j,-i}, {-j,i}, {-j,-i}});
虽然我知道这不是最好的方法并且我知道有很多不同的方法可以用最少的努力完成这个,但我想知道是否有 C++ 宏允许我简单地复制粘贴第一个上面vector的四个元素通过以下方式实现相同:
vector<pair<int,int>> moves({{i,j}, {i,-j}, {-i,j}, {-i,-j},
#define i j
#define j i
{i,j}, {i,-j}, {-i,j}, {-i,-j}
#undef i
#undef j
});
由于变量的循环引用,上面的代码显然不起作用。
P.S。 : 尽管 Matteo Italia 的回答在上述上下文中是绝对正确的,但我更想知道在 C++ 中是否可以使用宏交换变量的出现,以及如果可能的话如何交换?
如果您真的认为这样很节省,您可以使用函数式宏并调用它两次,交换其参数。
#define SIGN_COMB(a, b) {(a), (b)}, {(a), -(b)}, {-(a), (b)}, {-(a), -(b)}
vector<pair<int,int>> moves({SIGN_COMB(i, j), SIGN_COMB(j, i)})
宏扩展中的括号通常是为了避免表达式作为参数传递时出现意外情况(如果传入一个表达式,例如 x+y
,则否定项将是 -x+y
而不是 -(x+y)
).
宏是邪恶的,在这种情况下不是一个好主意。然而,由于这似乎是众所周知的,而且这个问题更具有学术性质:认为 "define" 而不是 "swap"。您既不能使用“i
”也不能使用“j
”作为宏的名称,因为您希望两者都出现在已处理的代码中。因此,为您的宏引入两个新的标识符。更新前四个元素以使用新标识符后,您可以按要求复制并粘贴它们。
vector<pair<int,int>> moves({
#define a i
#define b j
{a,b}, {a,-b}, {-a,b}, {-a,-b},
#undef a
#undef b
#define a j
#define b i
{a,b}, {a,-b}, {-a,b}, {-a,-b}
#undef a
#undef b
});