मेरे पास बड़ी संख्या में कक्षाएं हैं जिनका उपयोग कुछ विशिष्ट तरीकों को सजाने के लिए किया जाता है।सजाने के तरीकों के दौरान बॉयलरप्लेट को कम करना
क्या बॉयलरप्लेट कोड (मुख्य रूप से सभी कन्स्ट्रक्टर पैरामीटर और सदस्यों को पकड़ने के लिए) को कम करने का कोई साफ तरीका है जिसे इन कक्षाओं में से प्रत्येक में जोड़ा जाना चाहिए? या, इससे भी बेहतर, क्या ऐसा करने का एक अच्छा तरीका है?
मैं वर्चुअल विधियों का उपयोग नहीं कर सकता, और केवल जीसीसी 4.6 और बनाम 2010 द्वारा समर्थित सी ++ 11 सुविधाओं के सबसेट का उपयोग कर सकता हूं।
मेरा मानना है कि सी ++ 11 विरासत रचनाकार यहां मदद करेंगे, लेकिन न ही कंपाइलर उनका समर्थन करता है और मुझे कामकाज के बारे में पता नहीं है।
template<class Underlying, class T1>
struct A : Base<A<Underlying, T1> >
{
typedef AImpl<decltype(declval<Underlying>().foo()), T1> impl;
A(Underlying u, T1 t1) :
u_(u),
t1_(t1)
{}
impl foo() const { return impl(u_.foo(), t1_); }
impl bar() const { return impl(u_.bar(), t1_); }
const Underlying u_;
T1 t1_;
};
template<class Underlying, class T1, class T2>
struct B : Base<B<Underlying, T1, T2> >
{
typedef BImpl<decltype(declval<Underlying>().bar()), T1, T2> impl;
B(Underlying u, T1 t1, T2 t2) :
u_(u),
t1_(t1),
t2_(t2)
{}
impl foo() const { return impl(u_.bar(), 999, t2_); }
impl bar() const { return impl(u_.foo(), t1_, t2_); }
const Underlying u_;
T1 t1_;
T2 t2;
};
लेकिन वीसी ++ 2010 में नहीं ... – ildjarn
मुझे लगता है कि 'आगे' का उपयोग थोड़ा गलत (कम से कम अक्षम) हो सकता है। डिफ़ॉल्ट रूप से, 'आगे' का कोई भी उपयोग घटाए गए पैरामीटर प्रकारों के साथ एक विधि कॉल में होना चाहिए। इसका मतलब है कि 'टेम्पलेट बी (अंतर्निहित यू, वी && ... टी): u_ (u), t_ (std :: आगे (टी) ...) {} '। तीन चीजें: 1) फ़ंक्शन स्वयं टेम्पलेट होना चाहिए। 2) तर्कों को 'यू एंड& ...' के रूप में लिया जाना चाहिए, और 'आगे' shuld का उपयोग किया जाना चाहिए। वर्तमान कोड * बी * में पैरामीटर * प्रतिलिपि * करेगा और फिर यह * उन्हें * बेस क्लास में ले जा सकता है। आदर्श रूप से, आप शून्य प्रतियां चाहते हैं और जब संभव हो, तो सभी तरह से आगे बढ़ते हैं। –
दो चीजें, मानक कार्यान्वयन में टुपल का सदस्य नहीं है (यह बूस्ट में है), और आगे का उपयोग आपके कन्स्ट्रक्टर में गलत है। 'टेम्पलेट बी होना चाहिए (अंतर्निहित यू, वी && ... v): u_ (u), t_ (std :: आगे (v) ...) {}'। –
DRayX