यह साथ सी ++ 11 और decltype
संभव है। इसके लिए, हम इसका फायदा उठाएंगे कि जब सदस्य को बेस क्लास से विरासत में प्राप्त किया जाता है तो एक पॉइंटर-टू-सदस्य व्युत्पन्न वर्ग में सूचक नहीं होता है।
उदाहरण के लिए:
struct base{
void f(){}
};
struct derived : base{};
&derived::f
के प्रकार void (base::*)()
, नहीं void (derived::*)()
हो जाएगा। यह पहले से ही सी ++ 03 में सच था, लेकिन वास्तव में इसे निर्दिष्ट किए बिना बेस क्लास प्रकार प्राप्त करना असंभव था। decltype
के साथ, यह आसान है और केवल इस छोटे से समारोह की जरूरत है:
// unimplemented to make sure it's only used
// in unevaluated contexts (sizeof, decltype, alignof)
template<class T, class U>
T base_of(U T::*);
उपयोग:
#include <iostream>
// unimplemented to make sure it's only used
// in unevaluated contexts (sizeof, decltype, alignof)
template<class T, class R>
T base_of(R T::*);
struct base{
void f(){}
void name(){ std::cout << "base::name()\n"; }
};
struct derived : base{
void name(){ std::cout << "derived::name()\n"; }
};
struct not_deducible : base{
void f(){}
void name(){ std::cout << "not_deducible::name()\n"; }
};
int main(){
decltype(base_of(&derived::f)) a;
decltype(base_of(&base::f)) b;
decltype(base_of(¬_deducible::f)) c;
a.name();
b.name();
c.name();
}
आउटपुट:
base::name()
base::name()
not_deducible::name()
पिछले उदाहरण दिखाता है के रूप में, आप एक सदस्य उपयोग करने की आवश्यकता है कि वास्तव में उस बेस क्लास का विरासत सदस्य है जिसमें आप रुचि रखते हैं।
फिर से अधिक खामियां हैं, हालांकि: सदस्य भी स्पष्ट होना एक आधार वर्ग के सदस्य की पहचान करनी चाहिए:
struct base2{ void f(){} };
struct not_deducible2 : base, base2{};
int main(){
decltype(base_of(¬_deducible2::f)) x; // error: 'f' is ambiguous
}
यही कारण है, सबसे अच्छा आप हालांकि प्राप्त कर सकते हैं संकलक समर्थन के बिना।
उपयोग [ 'std :: is_base_of '] (http://stackoverflow.com/questions/2910979/how-is-base-of-works) – iammilind
@iammilind: यह केवल परीक्षण के लिए है, तो एक वर्ग का आधार है दूसरे के लिए, आपको पहले से ही परीक्षण करने के लिए बेस क्लास को जानना होगा। – Xeo
आपको इसके लिए क्या चाहिए? मुझे नहीं लगता कि यह संभव है, लेकिन शायद वास्तविक समस्या को हल करने के लिए अलग-अलग दृष्टिकोण हैं। –