2012-11-02 14 views
6

मैं अपनी परियोजना को C++ 11 में माइग्रेट कर रहा हूं और मैं यथासंभव मानक लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं।टेम्पलेट फ़ंक्शन के लिए 'typedef' (boost :: make_shared)

माइग्रेशन को अंतिम रूप देने से पहले, मुझे shared_ptr (बेंचमार्क, यूनिट परीक्षण आदि करने के लिए) के बूस्ट और एसटीएल कार्यान्वयन के बीच फ़्लिप करने का एक त्वरित तरीका चाहिए।

तो मैं shared_ptr इस तरह के लिए एक उपनाम परिभाषित:

#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 

अब मैं make_shared के लिए भी ऐसा ही करने की आवश्यकता है ... लेकिन कैसे? मैक्रो? एक रैपर? मुझे वास्तव में उनमें से कोई भी पसंद नहीं है। विकल्प क्या हैं?

+1

तुम बहुत पसंद है, लेकिन एक त्वरित आवरण लिखने के लिए नहीं है। – Puppy

उत्तर

7

variadic टेम्पलेट्स और सही अग्रेषण का उपयोग करना:

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

वही जवाब था जो मैं लिख रहा था, लेकिन आपने मुझे इसे हराया। – bstamour

+0

मैंने यही किया है, लेकिन मुझे इस तथ्य को पसंद नहीं है कि जिसके परिणामस्वरूप 'shared_ptr' की प्रतिलिपि बनाई गई है। –

+2

मुझे यकीन है कि कॉपी –