2011-10-30 19 views
10

में noncopyable लेकिन movable ऑब्जेक्ट को संग्रहीत करना मान लीजिए मेरे पास एक मज़ेदार है, जो noncopyable लेकिन movable है, मैं इसे std :: function में कैसे स्टोर कर सकता हूं? यानी, निम्नलिखित कोड कैसे संकलित करें? (जीसीसी 4.6 का उपयोग कर)std :: function

#include <functional> 
#include <iostream> 

struct S 
{ 
    S() = default; 
    S(S const&) = delete; 
    S& operator=(S const&) = delete; 
    S(S&&) { } 
    void operator()() { } 
}; 

std::function<void()> func; 

void make_func() 
{ 
    S s; 
    func = std::bind(std::move(s)); // This won't compile 
} 

int main() 
{ 
    make_func(); 
} 
+0

क्योंकि 's' स्थानीय है और दायरे से बाहर चला जाता है कि काम नहीं करेगा ... – Yahia

+0

' std :: समारोह <> 'प्रतिदेय वस्तु यह लपेटता शामिल नहीं है (मैं ठीक मान होता _avoid_ को उन्हें मुझे जंगम/प्रतिलिपि बनाने की आवश्यकता है)। – sehe

+0

यदि आप अपना कोड फिर से डिज़ाइन करते हैं तो यह संभव है और आप * 'std :: function' प्रारंभ करने में सक्षम हैं। उदाहरण के लिए यह 'एस एस काम करता है; std :: function func (std :: ref (s)); समारोह(); '। लेकिन आपको 'func' से पहले गुंजाइश से बाहर नहीं जाना है जिसका अर्थ है कि इसे किसी अर्थ में वैश्विक होना चाहिए। लेकिन फिर भी आप * std :: function' (प्रतिबंधों के साथ) में एक जंगम ऑब्जेक्ट स्टोर कर सकते हैं यदि यह आपका प्रश्न है। – alfC

उत्तर

2

जहां तक ​​मेरा मानक को समझते हैं, std::function copyable माना जाता है। इसलिए, आप सीधे प्राप्त नहीं कर सकते हैं जो आप चाहते हैं।

हालांकि, मुझे लगता है कि आप कुछ कस्टम रैपर से दूर हो सकते हैं। यह इस तरह कुछ होगा:

  • अपने रैपर को वास्तविक मज़ेदार को std::shared_ptr बनाते हैं;
  • जब एक रैपर एक मजेदार रावल्यू से बनाया गया है, तो मज़ेदार को गतिशील आवंटित स्मृति में ले जाएं;
  • रैपर और विनाशक के लिए कॉपी कन्स्ट्रक्टर को आसानी से shared_ptr कॉपी-सीटर/विनाशक द्वारा संभाला जाता है;
  • operator() रैपर के लिए वास्तविक मिक्सर और प्रतिनिधियों को स्मार्ट पॉइंटर को operator() पर संदर्भित करता है।
+1

पाठक के लिए व्यायाम? इस सामान्य रूप से विविध चरम टेम्पलेट्स और तर्क प्रकारों के पूर्ण अग्रेषण का उपयोग करके कार्यान्वित करें। – sehe

+0

धन्यवाद डबल, जो मेरी वर्तमान आवश्यकता को पूरा करता है। –

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