Perché usare boost :: ice_or invece di ||e boost :: ice_and invece di && in enable_if?
-
28-10-2019 - |
Domanda
Come afferma la domanda, c'è una ragione per cui le persone usano la versione struct rispetto ai normali condizionali?
Soluzione
Un estratto dalle Linee guida per la codifica Boost per espressioni costanti integrali :
Non utilizzare operatori logici nelle espressioni di costanti integrali; utilizza invece la meta-programmazione del modello.
L'intestazione contiene una serie di modelli di soluzioni alternative, che svolgono il ruolo di operatori logici, ad esempio invece di:
INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2
Usa:
::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value
Razionale: un certo numero di compilatori (in particolare i compilatori Borland e Microsoft), tendono a non riconoscere le espressioni costanti integrali che coinvolgono operatori logici come espressioni costanti integrali autentiche. Il problema generalmente si manifesta solo quando l'espressione della costante integrale è annidata nel codice del modello ed è difficile da riprodurre e diagnosticare.
Quindi direi mai su un compilatore conforme. (Ma se hai bisogno di supportare compilatori non conformi, usalo.)