2013-05-03 22 views
5

È valido lo stile di programmazione valido per utilizzare std::tr1::shared_ptr come std::shared_ptr immettendo la direttiva using nell'intestazione corrispondente? In questo modo:È legale posizionare usando tr1 :: shared_ptr nello spazio dei nomi std nell'intestazione?

namespace std 
{ 
    using tr1::shared_ptr; 
} 

So che è male inquinare tutto lo spazio dei nomi ma che dire di questo caso? Ci sono trucchi nascosti? Il compilatore di destinazione è VS2008 ma si desidera anche la compatibilità con le versioni successive.

+3

[Le versioni successive dovrebbero supportare anche 'std :: tr1'] (http://stackoverflow.com/a/2002972/241631). I compilatori non abbandoneranno l'intero spazio dei nomi; copieranno le cose da quello a 'std' proprio come si sta tentando di fare. Quindi riferirsi al tipo di 'std :: tr1 :: shared_ptr' non dovrebbe essere problematico per molto tempo. – Praetorian

+0

@cassini Che cosa ha detto il pretoriano^Se volevi seguire la tua strada, dovresti eseguire controlli del compilatore nel preprocessore per assicurarti di non avere conflitti su C++ 11 che supporta, e futuri, compilatori, che è disordinato e non così flessibile e non come portatile. – leetNightshade

+1

@leetNightshade In realtà è tutto quanto sopra. Certo, sfortunatamente non esiste un controllo del "compilatore supporta X", ma per la maggior parte degli scopi un semplice controllo del preprocessore per la versione C++ dovrebbe essere sufficiente, in futuro. –

risposta

3

Tecnicamente, lo Standard dice che si entra nel regno del comportamento indefinito se si fa questo:

17.6.4.2.1 namespace std [namespace.std]

1 Il comportamento di un programma C++ non è definito se aggiunge dichiarazioni o definizioni allo spazio dei nomi std o ad uno spazio dei nomi all'interno dello spazio dei nomi std se non diversamente specificato.

Ma in pratica, è probabile che tu possa farla franca. Diamine, anche Scott Meyers ha proposto un trucco alias allo stesso modo indefinito nello spazio dei nomi in Effective C++ 3rd Ed. (Articolo 54, p. 268) per utilizzare la funzionalità Boost come soluzione di arresto per la mancanza della funzionalità tr1.

namespace std { using namespace tr1 = ::boost; } 

vostro usando dichiarazione è anche un comportamento indefinito, ma andare avanti e saltare a destra

NOTA:. Commentare con un grande avvertimento grasso, #define e #pragma intorno alla vostra versione del compilatore e gli avvisi, e non appena man mano che si esegue l'aggiornamento a un compilatore/libreria che ha effettivamente std::shared_ptr, assicurarsi di rivisitare quell'intestazione e rimuovere il codice.

+0

Per aggiungere alla nota finale: i commenti sono belli e tutti . Tuttavia, tendono ad essere proprio questo, commenti. Se vuoi qualcosa con poteri un po 'più persuasivi usa invece le direttive del preprocessore. Qualcosa lungo le linee di #if definito (_MSC_VER) && (_MSC_VER> 1500) #error Rivisitare il seguente codice. #endif probabilmente innescherà un qualche tipo di azione quando appropriato. – IInspectable

+0

@Tim tnx, buon punto. Aggiornato! – TemplateRex

+0

Grazie, ma vorrei non rivedere questo codice dopo l'aggiornamento al nuovo compilatore. – cassini