2013-08-07 23 views
5

Sto sviluppando un'applicazione audio (in C++) e ho molte funzioni che si chiamano l'una o l'altra che prendono il numero di frame (cioè 1 mono o 2 campioni float stereo) o il numero grezzo di campioni ...Prevenire i cast automatici con numeri interi

È sempre più difficile tenere traccia della semantica di ogni funzione (campioni o frame?) e quando mult o div per nChannels, quindi mi piacerebbe in qualche modo fare un typedef samples_t e frames_t (a unsigned int) e farmi aiutare dal compilatore ...

C'è un modo semplice per avere una conversione implicita da frames_t in samples_t essere contrassegnata come un errore in C++?

+1

Per C++, è possibile trovare questo utile: http://www.boost.org/doc/libs/1_54_0/doc/html/boost_units/Quick_Start.html. –

+0

possibile duplicato di [Enforce strong type checking in C (type strictness for typedefs)] (http://stackoverflow.com/questions/376452/enforce-strong-type-checking-in-c-type-strictness-for-typedefs) o [Esiste un buon modo per forzare l'incompatibilità di tipo in C?] (http://stackoverflow.com/questions/3140035/is-there-a-good-way-to-force-type-incompatibility-in-c). –

+0

@OliCharlesworth: È possibile utilizzare «release» al posto della versione Boost che porta sempre alla documentazione per l'ultima versione stabile (modo consigliato) –

risposta

1

A meno che frames_t e samples_t siano in realtà tipi diversi. Potresti far sì che le strutture POD contengano un numero intero, ma la loro digitazione non avrà alcun effetto.

+0

, giusto? http://martin-moene.blogspot.co.uk/2012/07/light-on-whole-value.html – doctorlove

+0

Non è la soluzione più bella, ma in realtà ha funzionato abbastanza decentemente ... Ora posso almeno proteggere il codice più sensibile (in cui lo stack di elaborazione passa da uno all'altro) e sono riuscito a catturare la maggior parte dei fastidiosi bug (che sono difficili da rintracciare perché si manifestano suonando il suono e metà o due volte la velocità che dovrebbe) – MikasMix

0

Non è possibile farlo con typedef ma boost può aiutarti.

Se invece si è tipi non convertibili, BOOST_STRONG_TYPEDEF farà il trucco: Essa vi permetterà di effettuare il backup di più tipi che sono tutti unsigned ma non convertibili tra di loro quando vengono passati in giro.

Ma in una particolare applicazione che si può prendere in considerazione il quadro unità spinta dove si può effettivamente creare tipi di unità, in cui i risultati di aritmetica ereditano le unità corrette (così per esempio freq * time rendimenti senza unità).

Problemi correlati