Mentre stavo creando un progetto di recente, ho notato che ho ricevuto un avviso del compilatore (convertito in errore) sulla macro BOOST_STRONG_TYPEDEF
ridefinita. Dopo ulteriori indagini ho notato che ci sono due diverse versioni di strong_typedef.hpp
incluse in boost: una al livello superiore e una entro serialization/
.Perché boost include due diverse versioni di strong_typedef.hpp?
C'è anche una differenza tra le due versioni, non solo una versione duplicata della macro. La versione di livello superiore non in modo esplicito il valore-init sua T
mentre la versione serializzazione fa:
Codice tagli:
boost/strong_typedef.hpp
:
T t; \
explicit D(const T t_) : t(t_) {}; \
D(){}; \
D(const D & t_) : t(t_.t){} \
boost/serialization/strong_typedef.hpp
:
T t; \
explicit D(const T t_) : t(t_) {}; \
D(): t() {}; \
D(const D & t_) : t(t_.t){} \
Perché sono ci sono due diverse versioni della macro e quale ha più senso come implementazione? Quello che costringerà i tipi built-in a essere inizializzati o quello che non lo fa (il più fedelmente possibile mimando il tipo sottostante che è fortemente tipizzato)?
Esistono numerosi esempi in cui il codice è duplicato in diverse parti della libreria Boost. Mi piacerebbe anche sapere la risposta a questo. –
A volte le librerie copiano piccoli bit per ridurre le interdipen- sioni (quindi non è necessario avere tutto il boost disponibile), o solo per la cronologia: l'altra libreria non era ancora ufficiale quando la prima era stata accettata. –
@ edA-qa mort-ora-y Indubbiamente, copiare i bit per ridurre le dipendenze va bene in alcuni casi (come la duplicazione di una classe in uno spazio dei nomi dettagliato). Ma in questo caso particolare, è copiato in un modo che è illegale per quanto riguarda la lingua, in altre parole ridefinendo una macro. –