2012-11-02 12 views
6

Sto migrando il mio progetto in C++ 11 e sto provando a usare il maggior numero possibile di librerie standard.Un 'typedef' per una funzione template (boost :: make_shared)

Prima di finalizzare la migrazione, ho bisogno di un modo rapido per capovolgere tra implementazione boost e STL di shared_ptr (per fare benchmark, test unitari ecc.).

Così ho definito un alias per shared_ptr come questo:

#ifdef _USE_BOOST_ 
template <class C> 
using shared_ptr = boost::shared_ptr<C> 
#else 
template <class C> 
using shared_ptr = std::shared_ptr<C> 
#endif 

ora ho bisogno di fare lo stesso per make_shared ... Ma come? Macro? Un involucro? Non mi piace davvero nessuno dei due. Quali sono le alternative?

+1

Lei non hanno molta scelta, ma a dare una rapida involucro. – Puppy

risposta

7

Utilizzando i modelli variadic e spedizioni perfetta:

template<typename C, typename...Args> 
shared_ptr<C> make_shared(Args &&...args) { 
#ifdef _USE_BOOST_ 
    return boost::make_shared<C>(std::forward<Args>(args)...); 
#else 
    return std::make_shared<C>(std::forward<Args>(args)...); 
#endif 
} 
+0

Era esattamente la risposta che stavo scrivendo, ma mi hai battuto. – bstamour

+0

Questo è quello che ho fatto, ma non mi piace il fatto che il risultato 'shared_ptr' venga copiato due volte. –

+2

Non sono sicuro che la copia verrà ottimizzata –

Problemi correlati