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

У меня есть этот код в моем приложении в 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 pSettings& 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

Решение

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

В C ++ 14:

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

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

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

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

5

Другие решения

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

#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
);
}

Хорошая идея написать определение ITEMS внутри отдельного файла

0

По вопросам рекламы [email protected]