में इंटरफेस की एकाधिक विरासत मेरे पास एक ऑब्जेक्ट इंटरफ़ेस और इंटरफेस का एक खुला अंत संग्रह है जो व्युत्पन्न ऑब्जेक्ट का समर्थन करना चाह सकता है।सी ++
// An object
class IObject
{
getAttribute() = 0
}
// A mutable object
class IMutable
{
setAttribute() = 0
}
// A lockable object
class ILockable
{
lock() = 0
}
// A certifiable object
class ICertifiable
{
setCertification() = 0
getCertification() = 0
}
कुछ व्युत्पन्न वस्तुओं इस प्रकार दिखाई देंगे:
class Object1 : public IObject, public IMutable, public ILockable {}
class Object2 : public IObject, public ILockable, public ICertifiable {}
class Object3 : public IObject {}
यहाँ मेरी सवाल यह है: वहाँ एक रास्ता कार्यों कि केवल इन इंटरफेस के कुछ खास संयोजन ले जाएगा लिखने के लिए है? उदाहरण के लिए:
void doSomething(magic_interface_combiner<IObject, IMutable, ILockable> object);
doSomething(Object1()) // OK, all interfaces are available.
doSomething(Object2()) // Compilation Failure, missing IMutable.
doSomething(Object3()) // Compilation Failure, missing IMutable and ILockable.
मुझे मिली सबसे नज़दीकी चीज़ boost :: mpl :: वारिस है। मुझे कुछ सीमित सफलता मिली है, लेकिन यह वही नहीं करता जो मुझे चाहिए।
उदाहरण के लिए:
class Object1 : public boost::mpl::inherit<IObject, IMutable, ILockable>::type
class Object2 : public boost::mpl::inherit<IObject, ILockable, ICertifiable>::type
class Object3 : public IObject
void doSomething(boost::mpl::inherit<IObject, ILockable>::type object);
doSomething(Object1()) // Fails even though Object1 derives from IObject and ILockable.
doSomething(Object2()) // Fails even though Object2 derives from IObject and ILockable.
मैं :: एमपीएल :: इनहेरिट बढ़ावा देने के लिए कुछ इसी तरह लगता है लेकिन यह है कि आपूर्ति की प्रकार के सभी संभव क्रमपरिवर्तन काम हो सकता है के साथ एक विरासत पेड़ उत्पन्न होगा।
मैं इस समस्या को हल करने के लिए अन्य दृष्टिकोणों के बारे में भी उत्सुक हूं। आदर्श रूप से ऐसा कुछ जो रनटाइम के विपरीत समय जांच करता है (यानी कोई गतिशील_कास्ट नहीं)।
क्या आपका मतलब एंड-संयोजन, या OR-संयोजन है? –
यदि मैं गलत हूं, तो मुझे सही करें, लेकिन क्या आपके अमूर्त कार्यों को 'आभासी' के साथ-साथ '= 0' चिह्नित करने की आवश्यकता नहीं है? – ApproachingDarknessFish
मैं इसे टेम्पलेट का उपयोग करता हूं बल्कि गलत जवाब है? –