如何保持用结构替换std :: pair的“第一”和“第二”?

时间:2019-04-17 07:21:54

标签: c++ struct std-pair

我有一对std::pair<int, long>,并且在不同地方的代码中使用pr.firstpr.second(也有ppr->firstppr->second)这种表示法。 现在,我想将对更改为结构

struct ABC 
{
    int a;
    long b;
};

有没有一种方法可以在代码中保留这些“第一”和“第二”符号来访问此结构?也许创建一个函数?

2 个答案:

答案 0 :(得分:3)

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

struct ABC
{
    int first;
    long second;
};

但是,如果您希望将成员称为其他,则不想使用“ getter”功能(在调用位置需要括号),一种解决方案是使用成员变量的参考:

struct ABC {
    int a;
    long b;

    int& first;
    long& second;

    ABC() : first(a), second(b) {}
};

但是,如果您采用这种方式,则需要自己编写“ 5则规则”的一部分的构造函数,以正确地绑定引用,否则看似无痛的复制或移动将无效。

尽管此答案展示了C ++的强大功能,但该语言以其使您能够用脚射击自己的能力而闻名。作为解决方案的幻想,在您的代码库中甚至在语言本身发展的过程中,可能会引入好奇的bug的可能性不可低估。因此,应该将其视为反模式,并且仅在真正例外的情况下使用。

答案 1 :(得分:2)

您可能想尝试一下:

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

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

如前所述,这是undefined behaviour 12.3 Unions,但至少可以与MSVC和GCC一起使用。 感谢评论