Soru Şablon sürümü :: std :: abs


İşte mevcut aşırı yükleri listeler std::abs C ++ 'da. Neden sadece aşağıdaki şablonu tanımlamak ve çirkin C tarzı aşırı yükleri bırakalım diye merak ediyorum?

template <typename T> inline
T abs(const T& v) { return v < 0 ? -v : v; }

21
2018-04-02 11:10


Menşei


Ve ne abs<string> veya abs<foo*>? - Marius Bancila
@MariusBancila Sonra uyumlu olmayan türleri için derleme yapmaz. - Neil Kirk
Ayrıca sorunun cevabını bilmek isterim. Bir şablon olarak, abs'in uygun operatörleri destekleyen kendi sınıflarınızla çalışmasına izin verir. - Neil Kirk
..ve neden inline? - Columbo
@MariusBancila: Bir tamsayıya bir tamsayı karşılaştırmak derlenmez, ancak kabul edilemez bir hata iletisi verir. Ancak, istediğiniz gibi ekleyebilirsiniz std::enable_if<std::is_arithmetic<T>, void>  ve çok açıklayıcı olan "Aday şablon göz ardı edildi ..." gibi bir hata alırsınız. - Damon


Cevaplar:


Görmek LWG issue 2192. Şu anda, std::abs(x-y) < 2 eğer başarısız olursa x ve y imzasız. Bu ince bir programlama hatası yakalar. Önerilen değişiklikle birlikte derler ama tamamen yanlıştır. abs(3u-4u) 2'den çok daha büyük olurdu, aslında UINT_MAX.


19
2018-04-02 11:41



@MohitJain 0u - 1u == UINT_MAX, ve UINT_MAX == 2^(whatever) - 1. - Quentin
Bu harika bir örnektir ve 2192 sayılı konu ilginç bir okumadır. - Shafik Yaghmour
İyi, std::abs(3u - 4u) derler. Görmek cplusplus.com/reference/cmath/abs. - Lingxi
Yine de, integral türleri için aşırı yüklenmelerin neden bir geri dönüşü olduğunu anlamıyorum double Orijinal integral tipi yerine. - Lingxi
@ Lingxi: Yanlış sayfa? cplusplus.com/reference/cstdlib/abs . Veya daha iyi bir siteye bakın: en.cppreference.com/w/cpp/numeric/math/abs - MSalters


Bu, herşeyi eşleştirmek için olağan problemi çeker.

Hangi tür için bir örnek abs mantıklı ama bu uygulama değil complex<double>.


9
2018-04-02 11:20



Bir var std::abs Aşırı yük çözünürlüğü tarafından bulunacak ve tercih edilenlere göre karmaşık sayılar için aşırı yük, çünkü yukarıdakilerden daha uzmanlaşmış (kısmi sıralama). - Columbo
@Columbo: neden ortadan kaldıramayacağınız sorusuna cevap veriyor herşey mevcut aşırı yükler. - MSalters
@MSalters Karmaşık için şablonu uzmanlaşabilirdiniz. - Neil Kirk
@Columbo: Konu bu değil complex<double> Olduğu gibi çalışmaz: asıl nokta OP'deki tanımın makul türler için yanlış bir şekilde ortaya konabileceğini göstermektir. Benzer kullanıcı tanımlı türler derlenemez (veya daha kötüsü, sessizce derleme yanlış uygulama). - Hurkyl
@Hurkyl Cevabınızı yine de eleştirmeyi denemedim, bu daha çok bir yan notdu - bu şablon ve örn. complex oldukça iyi birlikte git :) - Columbo


Çünkü 'T' tipi, char dahil herhangi bir veri türüne erişebilir. Birisi abs fonksiyonuna bir char geçecek ne bekliyorsun. :)


1
2018-04-02 11:14



İnt için aynıdır, sadece 8 bitlik olacaktır. - Neil Kirk
evet @NeilKirk siz c ++ gibi doğru bir değer manipülasyonu yapacağız ve sonuç alacağız. Ama bu bir son kullanıcının istediği bir çıktı değil. - Nihar
@Nihar Err, ne? - Columbo
Hayır, C ++ bir "ASCII" manipülasyonu yapmayacak. şüphesiz bir sayısal manipülasyon yapacaktır. Aslında en büyük sorun şu ki charimzasız olabilir, bu da beklenmedik sonuçlar doğuracaktır (!) - MSalters
8-bit veriyi tutmak için char türlerini kullanmak yaygındır, en azından geçmişte hiç bir alternatif yoktur. Abs yapmak char Bununla birlikte, onun belirsizliği, uygulama tanımlandığı gibi, şüpheli olabilir. - Neil Kirk