La cosa che devi ricordare è che ogni float
-to-% conversione diint
e viceversa potenzialmente perde informazioni . Sulla maggior parte delle implementazioni, int
può memorizzare un numero intero più grande con precisione completa rispetto a float
, mentre i valori decimali di float
vengono tagliati durante la conversione in int
e che float
può memorizzare numeri più grandi di entra in un int
.
Ora, per il tuo caso d'uso specifico, potrebbe essere perfetto o più esattamente è esattamente ciò che desideri. Ma in generale , non si dovrebbero prendere queste conversioni alla leggera.
Considera solo l'esempio dalla tua domanda SO , che non include nemmeno la conversione di float
:
int size = vector.size(); // Throws an implicit conversion warning
int size = (int)vector.size(); // C like typecasting is discouraged and forbidden in many code standards
int size = static_cast<int>vector.size(); // This makes me want to gauge my eyes out (it's ugly)
Ciascuno di questi casi ha un bug sottile: se la dimensione di vector
è maggiore di numeric_limits<int>::max()
(in genere 2 ^ 31 - 1), non si ottiene la dimensione effettiva. Quindi qualsiasi cosa tu stia facendo con size
non funzionerà.
Ora puoi affermare che non avrai un vector
così grande. E questo potrebbe essere vero ... oggi . Quanti buchi / bug di sicurezza sono stati aperti perché un'applicazione è stata ridimensionata al punto in cui alcuni valori hanno superato il tipo previsto? E quanti bug esistono che sono là fuori, in agguato, in attesa di balzare una volta superata la dimensione arbitraria?
Ecco perché ricevi un avviso quando non lo converti in modo esplicito. Ecco perché C ++ usa la sintassi che "mi fa venir voglia di valutare i miei occhi". È perché quello che stai facendo potrebbe non essere sicuro . Quindi dovresti considerare attentamente se dovresti farlo.
Ed è qui che arriviamo:
3D voxelization of geometry; 3D reconstruction of 2D textures and subsequent UV mapping onto the original texture to store values; Conversion of float coordinates to grid cells for the cached version of perlin noise...
Ognuna di queste cose dovrebbe essere nascosta dietro qualche interfaccia che esegue internamente la conversione richiesta. E non una semplicistica funzione convert_int
; Intendo uno specifico per l'attività in questione. Se stai convertendo normalizzati [0, 1] in virgola mobile in coordinate di pixel di una certa dimensione, hai una funzione per fare esattamente questo. Verrebbero fornite le coordinate e la dimensione della trama e restituirebbero coordinate intere.
Il punto del consiglio è che il tuo codice non dovrebbe essere sparpagliato con tali conversioni nude.