2016-04-07 28 views
3

C++ Standart Kitaplığı normalde sınıfları için aşırı yüklenen operatörler sağladığından, karşılaştırma fonksiyonlarının (aslında gerçekten fonksiyonlar değil, aşırı yüklü() -operator içeren yapılar) neden olduğunu merak ettim, ancak std :: ratio sınıfı için karşılaştırma operatörleri yok.).std :: ratio neden karşılaştırma operatörlerini desteklemiyor?

Görüşüm, çok daha iyi bir kullanım ve okunabilirlik sağlarlar ve derleme zamanında da gerçekleştirilebilirler.

bile hiçbir sorun olması gerektiğini gibi başka bir işleve içine sararak, kullanarak.Gerçeği şablon metaprogramming gerekir kendi özel çözüm:

template<intmax_t N1, intmax_t D1, intmax_t N2, intmax_t D2> 
constexpr bool operator==(const ratio<N1, D1>& first, const ratio<N2, D2>& second) { 
    return ratio_equal<ratio<N1,D1>, ratio<N2,D2>>(); 
} 

Aslında benim için çalışıyor ve tüm diğer operatörler için kolayca adapte edilebilir Ayrıca

Bu yüzden bir şeyleri özlüyorum ya da neden operatörleri desteklememeye karar verdiğine dair bir fikriniz var mı?

+1

Oranları şablon parametresi olarak değil, nesne olarak ne sıklıkla kullanıyorsunuz? – Barry

+0

Aslında bu gerçekten iyi bir nokta, ama yine de yukarıdaki özelliği uygulamamasının bir nedeni değil. –

+0

Karşılaştırma için oranın kesinliğini korumak, kullanılan int türünü sessiz bir şekilde taşabilen payların ve paydaların çapraz çoğaltılmasını gerektirir. –

cevap

1

ratio sınıfı, örneklenecek şekilde tasarlanmamıştır; hiçbir veri üyesine sahip olmadığı için, ona dayalı herhangi bir nesne sınıf türünün kendisinden daha fazla bilgi içermez. Operatörler, türlere değil nesnelere karşı çağrılmaları gerektiğinden, bunları sağlamak anlamsız olacaktır. Bu, sınıfın başlatılmasının yararlı olacağı anlamına geleceğinden, karşı-üretken de olabilirdi.

Gerçekten derleme zamanı türleri yerine çalışma zamanı nesnelerine ihtiyacınız varsa, muhtemelen ratio'un uygun seçim olmadığını öneririm.

+0

Katılıyorum, bunun muhtemelen en önemli nedenlerden biri olduğunu da (Barry'nin de dediği gibi). Ama gerçekten de üyeler var (onlar statik ama ...), bkz http://en.cppreference.com/w/cpp/numeric/ratio/ratio –

+0

@ mr.green statik üyeler bir nesneye ait değil sınıfın kendisine aittirler. Standart sınıfın en az bir bayt almasını gerektirmesine rağmen, bu sınıf türünün bir nesnesi boş olacaktır. –

+0

Yazdıklarım (ya da "statik ..." ile yazdıklarım) ama sanırım birbirimizi konuşuyorduk –

1

Büyük olasılıkla öneri N2661 yazıldığında, constexpr henüz mevcut değildi. Bulunduğum ilk constexpr oluşumu N2235 idi, bu yüzden en azından derleyici uygulanmadı ve muhtemelen gelecekteki standartta dikkate alınacağından bile emin değildi. Sadece bir tahmin, belki de bu cevabı bile değmez.

İlgili konular