c++ - remove_pointer for unique_ptr's -
मुझे एक कोड के अनुसार एक NSDictionary
के अनुसार ऑब्जेक्ट एट्रिब्यूट्स का एक गुच्छा सेट करने की आवश्यकता है सर्वर। मैं उन विशेषताओं को अधिलेखित नहीं करना चाहता हूं जो डिक्शनरी में नहीं हैं।
चूंकि कई विशेषताएं हैं, मेरे पास ऐसे बयान हैं जो इस तरह दिखते हैं:
यदि (शब्दकोश [@ "address_1"]! = [NSNull नल]) self.configuration.userAddress1 = शब्दकोश [@ "address_1"];
शब्दकोश में कुंजी गुणों के नामों के समान नहीं हैं; दो अलग-अलग प्रणालियां हैं जो अलग-अलग बड़े हो गए हैं कि मैं एक साथ काम करने की कोशिश कर रहा हूं।
शायद मैं बहुत रूबी कोडिंग कर रहा हूं, लेकिन ऐसा लगता है कि ऐसा करने के लिए उद्देश्य-सी में बेहतर मुहावरा होना चाहिए। कोई भी विचार?
नहीं, यह ढीली नहीं है, क्योंकि उद्देश्य-सी गतिशील रूप से टाइप किया गया है। आप इसे कुंजी मान कोडन के साथ कर सकते हैं:
के लिए (शब्दकोश में NSString * key) {id value = dictionary [key]; [स्व। कॉन्फ़िगरेशन सेट वैल्यू: के लिए मूल्य: कुंजी]; }
लेकिन मेरी टिप्पणियों को देखें।
बीटीडब्ल्यू: यदि कोई कुंजी एक शब्दकोश में मौजूद नहीं है, तो परिणाम शून्य नहीं
[NSNull null]
।
इसलिए, यदि आप गुणों को सेट नहीं करना चाहते हैं जो शब्दकोश में नहीं हैं, तो आपको कुछ अतिरिक्त नहीं करना होगा। यदि आप गुण [NSNull null]
के साथ शब्दकोश में मौजूद गुण सेट नहीं करना चाहते हैं, तो आप अभी भी चेक जोड़ सकते हैं।
यदि आप रिक्त नहीं सेट करना चाहते हैं :
के लिए (शब्दकोश में NSString * key) {id value = dictionary [key]; यदि (मूल्य! = [NSNull null]) {[self.configuration setValue: मूल्य के लिए: कुंजी]; }}
यदि आप शून्य के साथ शून्य सेट करना चाहते हैं:
के लिए (शब्दकोश में NSString * key) {id value = dictionary [key]; अगर (मान == [एनएसएनull नल]) {value = शून्य; } [स्व। कॉन्फ़िगरेशन सेट वैल्यू: के लिए मूल्य: कुंजी]; }
मान लीजिए कि मैं एक बोर्ड गेम लिख रहा हूं एक बजाने वाला एअर इंडिया वर्ग बोर्ड
दो टेम्प्लेट पैरामीटर लेता है: पी और एन। एन खिलाड़ियों की संख्या है। पी या तो unique_ptr <खिलाड़ी>
या प्लेयर
है। मैं unique_ptr & lt; प्लेयर & gt;
का इस्तेमाल करता हूं जब वास्तव में गेम खेलता है, क्योंकि प्लेयर
के पास दो बाल वर्ग ( मानव
और AI
), लेकिन जब एआई खेल खोजता है, तो यह वही बोर्ड
वर्ग का उपयोग करता है, लेकिन टी = प्लेयर के साथ (मैं इसे संभावित प्रदर्शन लाभ के लिए चुना है, जैसे डेटा स्थानीय, कम भ्रमनिर्मित और ढेर होना चाहिए कम विखंडित होना)।
प्रश्न: मैं ऑपरेटर [] को कैसे परिभाषित करूंगा, जो कि खिलाड़ियों में से किसी एक का संदर्भ देता है (उदाहरण के लिए यदि टी = अनूठे_पीटर यह देता है * arr_ [i ], और फिर arr_ [i] लौटाता है नीचे एक प्रयास है, लेकिन संकलन नहीं करता है। इसके अलावा, डिजाइन पर टिप्पणी करने में बेझिझक (जैसे सिद्धांत में, क्या मैं वास्तव में पी शुरू करने से एक प्रदर्शन लाभ देख सकता हूं)।
टेम्पलेट & lt; typename P, size_t N & gt; क्लास बोर्ड {सार्वजनिक: पी & amp; ऑपरेटर [] (size_t idx) {वापसी सहायक (arr [idx]); } निजी: टेम्पलेट & lt; typename I, typename O & gt; इनलाइन ओ & amp; सहायक (I & amp; इनपुट) {वापसी इनपुट; } टेम्पलेट & lt; & gt; इनलाइन पी & amp; सहायक & lt; unique_ptr & lt; पी & gt;, पी & gt; (अनूठे_पीटर & lt; P & gt; इनपुट) {वापसी * इनपुट; } Std :: सरणी & lt; P, N & gt; arr_; };
कंपाइलर त्रुटियां:
- गैर-नेमस्पेस क्षेत्र में स्पष्ट विशेषज्ञता 'वर्ग फू'
- टेम्पलेट-आईडी सहायक, टी> में प्राथमिक टेम्पलेट की घोषणा
मैं इसके पीछे तर्क पर टिप्पणी नहीं करेगा, लेकिन कार्यान्वयन यह सिर्फ एक सहायक फ़ंक्शन पेश करने की आवश्यकता है: और सहायक की वापसी प्रकार का उपयोग करना। आपके प्रयास में आप जो समस्या देख रहे हैं वह है कि आपका ऑपरेटर [] अभी पी & amp;
वापस आया - जो कि पी
है एक std :: सहायक की वापसी प्रकार का उपयोग करने के लिए, हम इसे निजी स्थिर बनाते हैं और
decltype
पर निर्भर होते हैं:
टेम्पलेट & lt; typename P, size_t N & gt; क्लास बोर्ड {निजी: टेम्पलेट & lt; typename टी, टाइपनाम डी & gt; स्थिर टी एंड amp; Get_helper (std :: unique_ptr & lt; टी, डी & gt; & amp; वैल) {वापसी * val; } टेम्पलेट & lt; typename T & gt; स्थिर टी एंड amp; Get_helper (टी एंड amp) {वापसी val; } सार्वजनिक: decltype (get_helper (std :: declval & lt; पी & amp; & gt; ())) // एक ही वापसी प्रकार का उपयोग करें / / सहायक फ़ंक्शन ऑपरेटर के रूप में [] (size_t idx) {return get_helper (arr_ [idx]); } निजी: std :: सरणी & lt; P, N & gt; arr_; };
सी ++ में 14, टिप्पणी की गई रेखा सिर्फ हो सकती है (ऑटो)
।
Comments
Post a Comment