2012-08-03 17 views
7

ले जाएं मैंने अपनी कक्षा के लिए चलने वाले अर्थशास्त्र को लागू करने में काफी समय व्यतीत किया है, लेकिन अब मैं इसका उपयोग करने वाले कार्यों से निपट रहा हूं।अर्थशास्त्र और कॉन्स संदर्भ

ठीक है, तो मेरे पास यह ऑब्जेक्ट है जिसमें ढेर पर बहुत अधिक डेटा है: CLargeOb जिसके लिए मैंने चाल semantics (कन्स्ट्रक्टर और ऑपरेटर =) लागू किया। यह आदर्श इस तरह प्रयोग किया जाता है:

void OtherOb::Func(CLargeOb&& largeOb1, CLargeOb&& largeOb2) 
{ 
    SomeOtherFunc(largeOb1); // use objects 
    SomeOtherFunc(largeOb2); 
    m_largeOb1 = (CLargeOb&&)largeOb1; // save as members and trash the originals 
    m_largeOb2 = (CLargeOb&&)largeOb2; 
} 

हालांकि यह हमेशा नहीं वस्तुओं स्थानांतरित करने/ट्रैश किए अनुमति देने के लिए संभव है, तो मैं इन दोनों कार्यों कहा:

void OtherOb::Func(const CLargeOb& largeOb1, CLargeOb&& largeOb2) 
{ 
    SomeOtherFunc(largeOb1); 
    SomeOtherFunc(largeOb2); 
    m_largeOb1 = largeOb1; 
    m_largeOb2 = (CLargeOb&&)largeOb2; 
} 

void OtherOb::Func(CLargeOb&& largeOb1, const CLargeOb& largeOb2) 
{ 
    SomeOtherFunc(largeOb1); 
    SomeOtherFunc(largeOb2); 
    m_largeOb1 = (CLargeOb&&)largeOb1; 
    m_largeOb2 = largeOb2; 
} 

हालांकि यह काम करता है, आप पहले से ही कर सकते हैं अनुमान लगाएं कि यह * एसएस में एक बड़ा दर्द बन जाएगा जब मेरे पास एक ऐसा फ़ंक्शन है जो 3 या अधिक ऑब्जेक्ट्स को पैरामीटर के रूप में लेता है ... क्या टेम्पलेट्स का उपयोग करके इसे हल करने का कोई चालाक तरीका नहीं है या शायद 'पूर्ण अग्रेषण' हो सकता है?

+0

@MooingDuck: VS2010 में ठीक काम करता है, कोई समस्या नहीं है। ऑपरेटर = (&&) को आमंत्रित करने के लिए आपको इसे std :: move या && cast का उपयोग करके स्पष्ट रूप से कॉल करना होगा। लेकिन इसके नीचे प्रदान किया गया समाधान निश्चित रूप से बेहतर है। – demorge

+0

@ डेमोर्ज: ओह ठीक है, जब नाम दिया गया है तो मैं नियमों को पूरी तरह भूल गया हूं। उस –

+1

के लिए खेद है कृपया '(CLargeOb &&) bigOb1' के बजाय' std :: move (bigOb1) 'लिखें। आने वाले प्रोग्रामर की पीढ़ी गैर-मूर्खतापूर्ण और सीमा रेखा अपठनीय सी/सी ++ मिश्रण के बजाय एक चाल को सक्षम करने के मानक सी ++ 11 तरीके का उपयोग करने के लिए धन्यवाद देंगे। – fredoverflow

उत्तर

15

जैसा कि सी ++ 03 में मामला था, दिशानिर्देश है: यदि आप एक प्रतिलिपि चाहते हैं, तो इसे पैरामीटर सूची में बनाएं।

इस तरह आप वस्तु पाने के साथ फोन करने वाले सौदा की सुविधा देता है, तो आप सिर्फ परवाह किए बिना एक वस्तु मिलती है:

void OtherOb::Func(CLargeOb largeOb1, CLargeOb largeOb2) 
{ 
    SomeOtherFunc(largeOb1); // use objects 
    SomeOtherFunc(largeOb2); 
    m_largeOb1 = std::move(largeOb1); // save as members and trash the originals 
    m_largeOb2 = std::move(largeOb2); // (you should use std::move, not cast) 
} 

कॉलर:

OtherOb o; 

CLargeOb x, y; 
const CLargeOb z; 

o.Func(x, std::move(y)); // need x for later, done with y so move it 
o.Func(std::move(x), z); // done with x, necessarily copy z 

यह बस के रूप में कई विशेष भार के रूप में कुशल है। क्यूं कर? क्योंकि वे कक्षा में पहले से ही रचनाकार के रूप में मौजूद हैं। कंपाइलर को आपके लिए कॉल साइट पर कॉल करने दें, यह पहले से ही जानता है कि क्या करना है।

+2

मुझे यह पसंद है, इतना आसान! – demorge

+0

क्या यह एक बार की बजाय दो बार नहीं चलता है? (एनबी: बेशक, एक अतिरिक्त कदम मुश्किल से ध्यान देने योग्य होना चाहिए, इसलिए मैंने वैसे भी ऊपर उठाया है) – Sjoerd

+0

@Sjoerd: हां, उम्मीद है कि संकलक कहीं कहीं बढ़ जाएगा; और जैसा कि आपने कहा है, भले ही यह नहीं है, इससे कोई फर्क नहीं पड़ता। – GManNickG

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