2015-04-02 18 views
20

Here elenca gli attuali sovraccarichi di std::abs in C++. Mi chiedo perché non basta definire il seguente modello e lasciar andare tutti i brutti sovraccarichi in stile C?Versione modello di std :: abs

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

E qual è 'abs ' o 'abs '? –

+9

@ MarusBancila Quindi non verrà compilato per i tipi non compatibili. –

+0

Vorrei anche sapere la risposta alla domanda. Come modello, consentirebbe agli addetti di lavorare con le proprie classi che supportano gli operatori appropriati. –

risposta

19

Vedere LWG issue 2192. Attualmente, std::abs(x-y) < 2 non riesce se x e non sono firmati. Ciò interferisce con un sottile errore di programmazione. Con la modifica proposta, compila ma fa completamente il contrario. abs(3u-4u) sarebbe molto più grande di 2, infatti è UINT_MAX.

+0

@MohitJain '0u - 1u == UINT_MAX', e' UINT_MAX == 2^(qualunque sia) - 1'. – Quentin

+2

Questo è un ottimo esempio e il problema 2192 è una lettura interessante. –

+0

Bene, 'std :: abs (3u - 4u)' compila. Vedi http://www.cplusplus.com/reference/cmath/abs/. – Lingxi

1

Perché il tipo "T" può accedere a qualsiasi tipo di dati incluso char. Quindi cosa ti aspetti se qualcuno passerà un personaggio alla funzione abs. :)

+7

Lo stesso di int, tranne che sarà solo 8 bit. –

+0

si @NeilKirk sei corretto poichè C++ farà una manipolazione del valore ascii otterremo un risultato. Ma quello non è un risultato che vuole un utente finale. – Nihar

+1

@Nihar Err, cosa? – Columbo

9

Questo soffre il solito problema di abbinamento di tutto.

Un esempio di un tipo per il quale abs ha senso ma questa implementazione non è complex<double>.

+3

Esiste un sovraccarico 'std :: abs' per numeri complessi che verrebbero rilevati dalla risoluzione di sovraccarico e preferiti, poiché è più specializzato (in termini di ordinamento parziale) rispetto a quanto sopra. – Columbo

+0

@Columbo: risponde alla domanda perché non è possibile eliminare _all_ sovraccarichi di corrente. – MSalters

+0

@MSalters Beh, potresti specializzare il modello per Complesso. –

Problemi correlati