Çeşitli potansiyel olarak pahalı yöntemlerin sonucunu dikkate alması gereken bir karşılaştırıcı tanımlamanız gereken bir C++ sınıfına sahibim. Bu yöntemlerin sonucunu setimdeki tüm nesneler için önbelleğe almak istemiyorum, çünkü en yüksek önceliğe sahip kriterler daha ucuzdur ve altta çok pahalı olanların yalnızca nadir durumlarda tetiklenmesini beklerim.C++ zarif sözdizimi ile derin temsili karşılaştırma?
İlk bağımsız değişken, daha az, eşit veya daha büyük olduğunda, -1, 0 veya 1 döndüren bir cmp() işlevine sahip olsaydım ve tamsayıları koruyan kısayol mantıksal işleçler ile kolayca yazabilirim
int compare(const Class &rhs) const {
return cmp(expensive_method_a(), rhs.expensive_method_b()) ||
cmp(expensive_method_b(), rhs.expensive_method_b()) ||
...
}
Ne yazık ki < operatör ile çalışmak gerekir, bu yüzden, çirkin masraflı ve hataya açık hale gelir: alternatif olarak daha az maliyetli ama hala oldukça çirkin
bool operator<(const Class &rhs) const {
return expensive_method_a() < rhs.expensive_method_a() ||
(expensive_method_a() == rhs.expensive_method_a() &&
(expensive_method_b() < rhs.expensive_method_b() ||
(expensive_method_b() == rhs.expensive_method_b() &&
(...
))))
}
Veya:
Std :: tie hakkında This başka bir soru okudum, ancak doğru bir şekilde anlarsam, kravat karşılaştırmaya başlamadan önce tüm yöntemlerimi değerlendirirdi ve bu argümanların tembel bir şekilde değerlendirilmesini istiyorum. ,
bool operator<(const Class &rhs) const {
CUT_COMPARE(expensive_method_a(), rhs.expensive_method_a());
CUT_COMPARE(expensive_method_b(), rhs.expensive_method_b());
...
}
parantez özel kapsam benim _x
ve _y
içine umarak: Ben gibi kullanmak
#define CUT_COMPARE(a,b) { auto _x = (a); auto _y = (b); if (_x != _y) return (_x < _y); }
:
Ben bunun gibi bir önişlemci makro tanımlama hakkında düşünce Ancak, clang++
numaralı belge, _x
ve _y
'un çoklu tanımlarından şikayetçidir.
Bu konuda daha güzel bir yol var mı?
Clang neden şikayet ediyor? Kodu test etmedim, ancak değişkenlerin ayrı kapsamlarda olduğu görülüyor. –
Sadece bir not olarak, 'CUT_COMPARE' aslında burada yazılan nedenlerden dolayı #define CUT_COMPARE (a, b) {....} yazmalı (http) yazılmalıdır: http://stackoverflow.com/questions/ 1067226/c-çok satırlı makro-do-while0-vs-kapsam bloğu –