Wednesday, 15 August 2012

c++ - Initializing object of derived class using initializer-list -


मुझे एक struct B मिलता है जो कि struct A से प्राप्त होता है ।

<पूर्व> स्ट्रेट ए {int a; }; संरचना बी: सार्वजनिक ए {int b; };

क्या एक निर्माता को प्रदान किए बिना किसी प्रकार की वस्तु B को इनिशियलाइज़ करने का एक सीधा तरीका है, प्रारंभिक सूची-सूची का उपयोग करते हैं?

< Em> कुछ और अंतर्दृष्टि :

मुझे दो struct है जो कि मैं धागे के बीच डेटा को पार करने के लिए उपयोग करता हूं; दूसरा सिंक्रनाइज़ेशन वैरिएबल के अतिरिक्त के साथ, दूसरा, पहले डेटा के समान डाटा रखता है मैं पहली बार struct दूसरे एक डेटा का सदस्य बना सकता हूं, या सिर्फ दूसरे कोड में डेटा के सदस्यों की घोषणा की नकल कर सकता है, जो कि प्रारंभिक सूची को आसानी से उपयोग करने के लिए; लेकिन मुझे लगता है कि इस विशेष आवेदन में यह तार्किक रूप से अधिक सही होगा कि दूसरा struct पहले एक को बढ़ाता है।

कोई बहुत ही कम समाधान नहीं है, लेकिन कम से कम है एक समाधान:

  # शामिल करें & lt; type_traits & gt; # शामिल करें & lt; उपयोगिता & gt; संरचना बी: ए {इंट बी; टेम्पलेट & lt; typename ... Args, typename = typename std :: enable_if & lt; Std :: is_constructible & lt; ए, एर्ग और amp; ... ... gt; :: मूल्य & gt; बी (int x, args & amp; ... args): b (x), ए (std :: forward & lt; एआरजीएस & gt; (args) ...) {}};  

यह समाधान बिल्कुल छोटा नहीं है, लेकिन यह सामान्य है। बी के लिए नया कन्स्ट्रक्टर केवल उन विशेषज्ञताओं में ही मौजूद है जो सक्षम बनाता है, सक्षम-एसएफआईएनएई के लिए धन्यवाद, अतः B ठीक उसी तरह के रूप में बांधा जा सकता है जैसा कि हो सकता है।

यहां एक और खतरा है जो मुझे पता नहीं था, अर्थात् कैसे स्पष्ट नया कन्स्ट्रक्टर होना चाहिए। आदर्श रूप से यह मेलिंग कन्स्ट्रक्टर के रूप में स्पष्ट होना चाहिए, लेकिन प्रोग्रामैटिक रूप से (जोड़ी और ट्यूपल्स के लिए किया गया) का पता लगाने में थोड़ा मुश्किल है।


No comments:

Post a Comment