2012-11-02 4 views
6

Ich migiere mein Projekt nach C++ 11 und versuche so viel wie möglich von der Standardbibliothek zu verwenden.Ein 'typedef' für eine Template-Funktion (boost :: make_shared)

Bevor ich die Migration abgeschlossen habe, brauche ich einen schnellen Weg, um zwischen Boost und STL-Implementierung von shared_ptr (für Benchmarks, Komponententests usw.) zu wechseln.

So definiert ich einen Alias ​​für shared_ptr wie folgt aus:

#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 

jetzt brauche ich das gleiche für make_shared zu tun ... Aber wie? Makro? Ein Wrapper? Ich mag beide nicht wirklich. Was sind die Alternativen?

+1

Sie haben nicht viel anderes übrig, als einen schnellen Wrapper zu schreiben. – Puppy

Antwort

7

Mit variadische Vorlagen und perfekte Forwarding:

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

War genau die Antwort, die ich schrieb, aber Sie haben mich dazu geschlagen. – bstamour

+0

Das habe ich gemacht, aber ich mag es nicht, dass das resultierende 'shared_ptr' zweimal kopiert wird. –

+2

Ich bin mir ziemlich sicher, dass die Kopie optimiert wird –

Verwandte Themen