我怎样才能保持'first'和'second'用结构替换 std::p air?

How can I keep 'first' and 'second' replacing std::pair with struct?

本文关键字:结构 std air second 替换 first      更新时间:2023-10-16

我有一对std::pair<int, long>,在不同地方的代码中使用pr.firstpr.second(也ppr->firstppr->second)类型的符号。 现在我想将这对更改为结构体,

struct ABC 
{
int a;
long b;
};

有没有办法在代码中保留这些"第一"和"第二"符号来访问此结构?也许创建一个函数?

撇开您想要这样做的原因(在没有任何其他信息的情况下至少可以说是有问题的),最简单的方法是使用

struct ABC
{
int first;
long second;
};

但是,如果您希望调用其他成员,并且不想诉诸"getter"函数(这需要在调用站点使用括号),则解决方案是对成员变量使用引用:

struct ABC {
int a;
long b;
int& first;
long& second;
ABC() : first(a), second(b) {}
};

但是,如果您采用此方法,则需要自己编写属于"5 法则"一部分的构造函数以正确绑定引用,否则看似无趣的副本或移动将不起作用。

虽然这个答案展示了C++的力量,但这种语言以其允许你搬起石头砸自己的脚的能力而闻名。尽管解决方案很花哨,但随着代码库甚至语言本身的发展,引入奇怪错误的可能性怎么强调都不为过。因此,这应该被认为是一种反模式,并且只在真正特殊的情况下使用。

你可能想试试这个:

struct ABC 
{
union {
int a;
int first;
};
union {
long b;
long second;
};
};

这允许您使用afirst以及可互换bsecond。 不过,最好替换firstsecond用法以避免混淆。

正如所指出的,这是未定义的行为12.3 Unions但至少适用于MSVC和GCC。 感谢评论