Как я могу сохранить 'first' и 'second', заменив std :: pair на struct? - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть пара std::pair<int, long>, и в коде в разных местах используются обозначения pr.first, pr.second (также ppr->first, ppr->second). Теперь я хочу изменить пару на структуру,

struct ABC 
{
    int a;
    long b;
};

есть ли способ сохранить эти «первые» и «вторые» нотации в коде для доступа к этой структуре? Может быть, создание функции?

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

Если оставить в стороне причины, по которым вы хотите это сделать (что при отсутствии какой-либо другой информации представляется сомнительным, если не сказать больше), самый простой способ - использовать

struct ABC
{
    int first;
    long second;
};

Но если вы хотите, чтобы члены назывались как-то еще и , вы не хотите прибегать к функциям "получателя" (которые требуют скобок на вызывающем сайте), решение состоит в том, чтобы использовать ссылки для переменных-членов:

struct ABC {
    int a;
    long b;

    int& first;
    long& second;

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

Но если вы примете это, вам нужно написать конструкторов, которые являются частью «правила 5», для правильного связывания ссылок, в противном случае, казалось бы, анодная копия или перемещение не будут работать.

Хотя этот ответ демонстрирует мощь C ++, язык славится своей способностью позволять вам стрелять себе в ногу. Как ни странно, это может показаться причудливым, но вероятность появления любопытных ошибок в качестве вашей кодовой базы и даже самого языка не может быть переоценена. Как таковое, это должно рассматриваться как антипаттерн и использоваться только в действительно исключительных обстоятельствах.

2 голосов
/ 17 апреля 2019

Вы можете попробовать это:

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

Это позволяет вам использовать a и first, а также b и second взаимозаменяемо.Возможно, было бы лучше заменить использование first и second, чтобы избежать путаницы.

Как указывалось, это неопределенное поведение 12.3 Unions, но будет работать с MSVC и GCC как минимум.спасибо за комментарии

...