2013-05-15 7 views
10

boost::optional<T> प्रारंभ करने के लिए मुझे क्या करना चाहिए यदि अंतर्निहित प्रकार T गैर-डिफ़ॉल्ट रचनात्मक, गैर-प्रतिलिपि/चलने योग्य है, लेकिन किसी का उदाहरण अभी भी मौजूद हो सकता है?init boost :: गैर-प्रतिलिपि ऑब्जेक्ट का वैकल्पिक

यह template< typename... Args > boost::optional<T>::construct(Args && ...args) जैसे कुछ सदस्य समारोह के लिए किसी भी अर्थ कारणों से boost::optional के लिए मना किया है, कि करने के लिए सभी तर्कों बचाता है यथा-स्थान operator new वस्तु पूरी तरह से (गैर रेफरी प्रकार T के लिए) के निर्माण के लिए? संस्करण std::make_shared<T> जैसे गैर-सदस्य कार्य होना है।

मुझे ऐसा लगता है, कि मेरी समस्या std::unique_ptr/std::shared_ptr का उपयोग कर के माध्यम से हल किया जा सकता है, लेकिन इस मामले में मेरे सवाल है: "क्यों boost::optional प्रगति जमे हुए है?"।

उत्तर

14

boost::optionalin-place factories का उपयोग कर गैर-प्रतिलिपि प्रकार के साथ प्रारंभ किया जा सकता है।

विशेष रूप से, आप उन्हें इस तरह का उपयोग कर सकते हैं:

#include <boost/optional.hpp> 
#include <boost/utility/in_place_factory.hpp> 

class MyType : private boost::noncopyable 
{ 
public: 
    MyType(T1 const& arg1, T2 const& arg2); 
} 
... 
boost::optional<MyType> m_var; 
... 
m_var = boost::in_place(arg1, arg2); 
... 

सी ++ 14 में एक प्रस्तावित std::make_optional कि इस समस्या का एक बेहतर समाधान हो जाएगा है। हालांकि, यह बूस्ट में लागू नहीं किया गया है। वैकल्पिक।

+0

यदि यह डिफ़ॉल्ट रूप से रचनात्मक है तो क्या होगा? एक noncopyable बूस्ट बनाने के लिए कोई तरीका है :: बिना बढ़ावा के वैकल्पिक :: in_place? मेरे विभिन्न प्रयास संकलन में विफल रहे हैं – Geronimo

संबंधित मुद्दे