2012-11-02 14 views
6

Przeprowadzam migrację mojego projektu do C++ 11 i próbuję użyć jak najwięcej biblioteki standardowej, jak to tylko możliwe.'Typedef' dla funkcji szablonu (boost :: make_shared)

Zanim sfinalizuję migrację, potrzebuję szybkiego sposobu na przełączanie między zwiększeniem i implementacją STL shared_ptr (w celu wykonania testów porównawczych, testów jednostkowych itp.).

Więc zdefiniowany alias shared_ptr jak ten:

#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 

teraz muszę zrobić to samo dla make_shared ... Ale jak? Makro? Owijarka? Naprawdę nie lubię żadnego z nich. Jakie są alternatywy?

+1

Nie masz wielkiego wyboru, ale napisać krótki opakowanie. – Puppy

Odpowiedz

7

Korzystanie zmiennej liczbie argumentów szablonów i idealne do korespondencji:

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

To była dokładnie odpowiedź, którą pisałem, ale mnie do tego przekonałeś. – bstamour

+0

Tak właśnie zrobiłem, ale nie podoba mi się to, że wynikowa 'shared_ptr' jest kopiowana dwukrotnie. –

+2

Jestem całkiem pewny, że kopia zostanie zoptymalizowana –

Powiązane problemy