#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
);
}
Хорошей идеей будет записать определение элементов в отдельный файл