2015-04-02 10 views
20

Here zawiera listę bieżących przeciążeń std::abs w C++. Zastanawiam się, dlaczego nie zdefiniować poniższego szablonu i puścić wszystkie brzydkie przeciążenia w stylu C?Wersja szablonu std :: abs

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

Co to jest "abs " lub "abs "? –

+9

@MariusBancila Następnie nie będzie kompilacji dla niekompatybilnych typów. –

+0

Chciałbym także znać odpowiedź na to pytanie. Jako wzorzec pozwoliłby abs pracować z własnymi klasami, które wspierają odpowiednich operatorów. –

Odpowiedz

19

Zobacz LWG issue 2192. Obecnie std::abs(x-y) < 2 kończy się niepowodzeniem, jeśli x i y są niepodpisane. Łapie to subtelny błąd programowania. Z proponowaną zmianą kompiluje, ale robi to całkowicie źle. abs(3u-4u) byłaby znacznie większa niż 2, w rzeczywistości jest to UINT_MAX.

+0

@MohitJain '0u - 1u == UINT_MAX' oraz' UINT_MAX == 2^(niezależnie) - 1'. – Quentin

+2

To świetny przykład, a numer 2192 jest interesującą lekturą. –

+0

Cóż, kompiluje 'std :: abs (3u - 4u). Zobacz http://www.cplusplus.com/reference/cmath/abs/. – Lingxi

1

Ponieważ typ "T" może uzyskać dostęp do dowolnego typu danych, w tym char. Więc czego się spodziewać, jeśli ktoś przejdzie char do funkcji abs. :)

+7

To samo co dla int, z wyjątkiem tego, że będzie to tylko 8-bitów. –

+0

yes @NeilKirk masz rację, ponieważ C++ zrobi manipulację wartością ascii otrzymamy wynik. Ale to nie jest wyjście, czego chce użytkownik końcowy. – Nihar

+1

@Nihar Err, co? – Columbo

9

Powoduje to zwykle problem z dopasowaniem wszystkiego.

Przykład typu, dla którego abs ma sens, ale ta implementacja nie jest complex<double>.

+3

Istnieje przeciążenie 'std :: abs' dla liczb zespolonych, które zostałyby znalezione przez rozdzielczość przeciążenia i preferowane, ponieważ jest bardziej wyspecjalizowane (pod względem częściowego porządkowania) niż powyższe. – Columbo

+0

@ Columbo: odpowiada na pytanie, dlaczego nie można wyeliminować bieżących przeciążeń. – MSalters

+0

@MSalters Cóż, możesz specjalizować szablon dla Complex. –

Powiązane problemy