ले जाएं मैंने अपनी कक्षा के लिए चलने वाले अर्थशास्त्र को लागू करने में काफी समय व्यतीत किया है, लेकिन अब मैं इसका उपयोग करने वाले कार्यों से निपट रहा हूं।अर्थशास्त्र और कॉन्स संदर्भ
ठीक है, तो मेरे पास यह ऑब्जेक्ट है जिसमें ढेर पर बहुत अधिक डेटा है: 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 या अधिक ऑब्जेक्ट्स को पैरामीटर के रूप में लेता है ... क्या टेम्पलेट्स का उपयोग करके इसे हल करने का कोई चालाक तरीका नहीं है या शायद 'पूर्ण अग्रेषण' हो सकता है?
@MooingDuck: VS2010 में ठीक काम करता है, कोई समस्या नहीं है। ऑपरेटर = (&&) को आमंत्रित करने के लिए आपको इसे std :: move या && cast का उपयोग करके स्पष्ट रूप से कॉल करना होगा। लेकिन इसके नीचे प्रदान किया गया समाधान निश्चित रूप से बेहतर है। – demorge
@ डेमोर्ज: ओह ठीक है, जब नाम दिया गया है तो मैं नियमों को पूरी तरह भूल गया हूं। उस –
के लिए खेद है कृपया '(CLargeOb &&) bigOb1' के बजाय' std :: move (bigOb1) 'लिखें। आने वाले प्रोग्रामर की पीढ़ी गैर-मूर्खतापूर्ण और सीमा रेखा अपठनीय सी/सी ++ मिश्रण के बजाय एक चाल को सक्षम करने के मानक सी ++ 11 तरीके का उपयोग करने के लिए धन्यवाद देंगे। – fredoverflow