использование std::tie для сравнения структур

#c #qt #overloading #operator-keyword #tie

#c #qt #перегрузка #оператор-ключевое слово #связать

Вопрос:

У меня есть этот код в моем приложении на Qt C . Мой operator== для сравнения структур всегда возвращает false, даже если они равны. Что не так с моим кодом?

Вот фрагмент кода, в котором есть проблема:

 struct pSettings
{
    int speciality;
    bool autoCompleteByWord;
    bool showChronicConditions;
    bool showNavArrows;
    bool smallScreenMode;
    bool simpleExamination;
    bool alwaysSave;
    bool inLinePatientList;
    double newVisitPrice;
    double followVisitprice1;
    double followVisitprice2;
    double followVisitprice3;
    double followVisitprice4;
    int autosaveinterval;
    bool  autoSave ;
    bool minimizeToTray;
    int selectedTheme;
    QString textColor;
    QString topBGColor;
    QString bottomBGColor;
    QString altWinColor;
    QString buttonColor;
    QString altButtonColor;
    QString textBGColor;
    QString borderColor1;
    QString borderColor2;
    QString altButtonColorHover;
    QString buttonColorHover;
    QString buttonColorDisabled;
    QString buttonBorderColorHover;
    QString comboBGcolor;
    QString buttonTextColor;
    QString comboTextColor;
    double lOffSet,tOffSet;

    QString defaultFont;
    double defaultFontSize;
    bool defaultFontBold;

    QString textboxFont;
    double textboxFontSize;
    bool textboxFontBold;

    int maxFollowUps;
    bool autoClosePrintDlg;
    int maxFollowUpsPerProblem;
    bool autoSetnewAfterMaxPerProblemIsReached;
    int checkoutDate;
    int checkoutTime;
    bool enableVisualEffects;

    bool operator==(const pSettingsamp; psettings) const
    {
        return std::tie(
                    speciality,
                    autoCompleteByWord,
                    showChronicConditions,
                    showNavArrows,
                    smallScreenMode,
                    simpleExamination,
                    alwaysSave,
                    inLinePatientList,
                    newVisitPrice,
                    followVisitprice1,
                    followVisitprice2,
                    followVisitprice3,
                    followVisitprice4,
                    autosaveinterval,
                    autoSave ,
                    minimizeToTray,
                    selectedTheme,
                    textColor,
                    topBGColor,
                    bottomBGColor,
                    altWinColor,
                    buttonColor,
                    altButtonColor,
                    textBGColor,
                    borderColor1,
                    borderColor2,
                    altButtonColorHover,
                    buttonColorHover,
                    buttonColorDisabled,
                    buttonBorderColorHover,
                    comboBGcolor,
                    buttonTextColor,
                    comboTextColor,
                    lOffSet,
                    tOffSet,
                    defaultFont,
                    defaultFontSize,
                    defaultFontBold,
                    textboxFont,
                    textboxFontSize,
                    textboxFontBold,
                    maxFollowUps,
                    autoClosePrintDlg,
                    maxFollowUpsPerProblem,
                    autoSetnewAfterMaxPerProblemIsReached,
                    checkoutDate,
                    checkoutTime,
                    enableVisualEffects) ==
                std::tie(psettings.speciality,
                         psettings.autoCompleteByWord,
                         psettings.showChronicConditions,
                         psettings.showNavArrows,
                         psettings.smallScreenMode,
                         psettings.simpleExamination,
                         psettings.alwaysSave,
                         psettings.inLinePatientList,
                         psettings.newVisitPrice,
                         psettings.followVisitprice1,
                         psettings.followVisitprice2,
                         psettings.followVisitprice3,
                         psettings.followVisitprice4,
                         psettings.autosaveinterval,
                         psettings.autoSave ,
                         psettings.minimizeToTray,
                         psettings.selectedTheme,
                         psettings.textColor,
                         psettings.topBGColor,
                         psettings.bottomBGColor,
                         psettings.altWinColor,
                         psettings.buttonColor,
                         psettings.altButtonColor,
                         psettings.textBGColor,
                         psettings.borderColor1,
                         psettings.borderColor2,
                         psettings.altButtonColorHover,
                         psettings.buttonColorHover,
                         psettings.buttonColorDisabled,
                         psettings.buttonBorderColorHover,
                         psettings.comboBGcolor,
                         psettings.buttonTextColor,
                         psettings.comboTextColor,
                         psettings.lOffSet,
                         psettings.tOffSet,
                         psettings.defaultFont,
                         psettings.defaultFontSize,
                         psettings.defaultFontBold,
                         psettings.textboxFont,
                         psettings.textboxFontSize,
                         psettings.textboxFontBold,
                         psettings.maxFollowUps,
                         psettings.autoClosePrintDlg,
                         psettings.maxFollowUpsPerProblem,
                         psettings.autoSetnewAfterMaxPerProblemIsReached,
                         psettings.checkoutDate,
                         psettings.checkoutTime,
                         psettings.enableVisualEffects);
    }

};
  

Комментарии:

1. Не могли бы вы сузить код до соответствующего материала, пожалуйста?

2. @dasblinkenlight std::tie здесь подходит. Использование tuple приведет к копированию всех данных.

3. std::tie проще, поэтому я хочу его использовать

4. Вы уверены double , что поля должны быть равными? Часто сравнивать их по == оператору — плохая идея. Обратите внимание, что возвращается сравнение объекта с самим true собой .

5. Попробуйте протестировать struct, в котором всего несколько полей (например, double и QString). Затем предоставьте полный пример с функцией main, которая проверяет эти простые структуры.

Ответ №1:

Где-то в длинных списках teo у вас есть ошибка, когда они не идентичны. Вы нарушили DRY (не повторяйтесь).

В C 14:

 auto mytie() const {
  return std::tie( /* ... fields */ );
}
  

Затем напишите == , используя это.

В C 11 вы должны писать mytie(blah constamp; self) как локальную (без состояния) лямбду, чтобы все было разумно.

Если это не удается, то они сравниваются неравными, потому что они отличаются так, как вы не заметили.

Ответ №2:

Для этого вы можете использовать макрофункцию высокого порядка:

 #define ITEMS                   
ITEM(int,  speciality)          
ITEM(bool, autoCompleteByWord)  
...
ITEM(int,  checkoutTime)        
LAST(bool, enableVisualEffects)

#define ITEM(x,y) x y;
#define LAST(x,y) ITEM(x,y)

struct pSettings
{
    ITEMS
}

#define ITEM(x,y) y,
#define LAST(x,y) y

auto mytie() const
{
    return std::tie
    (
        ITEMS
    );
}
  

Хорошей идеей будет записать определение элементов в отдельный файл