एक मेटा-समारोह extends
बुलाया परिभाषित करें (जो सिर्फ एक चीनी लेपित नाम है) के रूप में:
template<typename D, typename B>
using extends = std::is_base_of<B,D>;
तब के रूप में अपने वर्ग को परिभाषित:
template <class B>
class C
{
//here you can check it, and generate your own error message!
static_assert(extends<B,A>(),
"Constraint Violation: B doesn't derive from A.");
B instance;
};
या, आप यह बजाय लिख सकते हैं :
//define it a bit differently now!
template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;
template <class B, class Unused=extends<B,A>>
class C
{
B instance;
};
लेकिन इस मामले में, आपके पास अपना खुद का एरो उत्पन्न करने का अवसर नहीं है आर संदेश। कंपाइलर फेंकने के लिए स्वतंत्र है आपको कोई त्रुटि संदेश समझना मुश्किल हो सकता है।
वैसे भी, आपको शायद एहसास हो कि आप सीधे std::is_base_of<>
का उपयोग कर सकते हैं। लेकिन यदि आप चीनी-लेपित नाम के लिए देख रहे हैं, तो extends
अच्छा लगता है!
@LuchianGrigore: समान, लेकिन वह एक कार्य के बारे में है और यह कक्षाओं के बारे में है। समाधान थोड़ा अलग हो सकते हैं (उदा। Enable_if शीर्ष जवाब है, लेकिन यहां ज्यादा समझ नहीं आता है)। –