(Not: tupleve tieBoost veya C ++ 11'den alınabilir.)
Yalnızca iki öğeli küçük yapılar yazarken std::pair, operator<katı-zayıf sıralama gibi tüm önemli şeyler bu veri türü için zaten yapıldığından, bazen a seçme eğilimindeyim. .
Olumsuz yönleri, oldukça işe yaramaz değişken isimleridir. Kendimi o yarattı bile typedef, ben 2 gün sonra hatırlamayacaksınız firstve hangi secondonlar aynı türden ikisi de, özellikle eğer tam olarak. İkiden fazla üye için bu durum daha da kötüleşiyor, çünkü yuvalama pairoldukça berbat.
Bunun için diğer seçenek birtupleya Boost ya da C ++ 11'den, ancak bu gerçekten daha hoş ve net görünmüyor. Bu yüzden, gerekli karşılaştırma operatörleri de dahil olmak üzere yapıları kendim yazmaya geri dönüyorum.
Özellikle, operator<oldukça külfetli olabileceğinden, sadece aşağıdakiler için tanımlanan işlemlere güvenerek tüm bu karmaşadan kurtulmayı düşündüm tuple:
Örneğin, operator<katı-zayıf-sıralama örneği :
bool operator<(MyStruct const& lhs, MyStruct const& rhs){
return std::tie(lhs.one_member, lhs.another, lhs.yet_more) <
std::tie(rhs.one_member, rhs.another, rhs.yet_more);
}
( tieBir hale getirir tupleve T&geçirilen ifade referanslar).
Düzenleme : @DeadMG'den özel olarak miras alma önerisi tuplekötü değil, ancak bazı dezavantajları var:
- Operatörler bağımsızsa (muhtemelen arkadaş), herkese açık olarak miras almam gerekir
- Döküm ile, işlevlerim / işleçlerim (
operator=özellikle) kolayca atlanabilir - İle
tieonlar sipariş için önemli değil eğer çözümü, ben bazı üyelerini bırakabilir
Bu uygulamada dikkate almam gereken herhangi bir sakınca var mı?