इस question का जवाब पढ़ने के बाद, मुझे पता चला कि SFINAE दो कि क्या वर्ग एक निश्चित सदस्य समारोह के आधार पर काम करता है के बीच चयन करने के लिए इस्तेमाल किया जा सकता। यह निम्नलिखित के बराबर है, बस यह है कि अगर बयान में प्रत्येक शाखा एक ओवरलोड समारोह में विभाजित है:एकाधिक SFINAE नियम
template<typename T>
void Func(T& arg)
{
if(HAS_MEMBER_FUNCTION_X(T))
arg.X();
else
//Do something else because T doesn't have X()
}
हो जाता है
template<typename T>
void Func(T &arg, int_to_type<true>); //T has X()
template<typename T>
void Func(T &arg, int_to_type<false>); //T does not have X()
अगर यह SFINAE विस्तार करने के लिए कई करने के लिए संभव हो गया था मैं सोच रहा था नियम। कुछ ऐसा है जो इस बात का बराबर होगा:
template<typename T>
void Func(T& arg)
{
if(HAS_MEMBER_FUNCTION_X(T)) //See if T has a member function X
arg.X();
else if(POINTER_DERIVED_FROM_CLASS_A(T)) //See if T is a pointer to a class derived from class A
arg->A_Function();
else if(DERIVED_FROM_CLASS_B(T)) //See if T derives from class B
arg.B_Function();
else if(IS_TEMPLATE_CLASS_C(T)) //See if T is class C<U> where U could be anything
arg.C_Function();
else if(IS_POD(T)) //See if T is a POD type
//Do something with a POD type
else
//Do something else because none of the above rules apply
}
यह संभव तरह कुछ है?
धन्यवाद।
धन्यवाद (जाहिर है, जब बुला आप के रूप में विकल्प परस्पर अनन्य नहीं हैं देखभाल करने के लिए है)। मैं IS_TEMPLATE_CLASS_C उदाहरण को छोड़कर enable_if का उपयोग कर सबकुछ काम करने में कामयाब रहा हूं। क्या is_base_of के समान कुछ लिखने का कोई तरीका है जो काम करेगा? अर्थात is_template_of < C, T > :: मान हमेशा सही हो सकता है अगर टी सी, सी , आदि था, और बाकी सब –
Fred
@Fred के लिए झूठी: समस्या यह है कि 'सी' और 'सी ' असंबंधित प्रकार के होते हैं है। मेरा पहला विचार कुछ टाइपिफ़ या अभिन्न प्रकार के सदस्य को 'IsInstantiatedTemplateC' नामक वर्ग टेम्पलेट' सी 'में जोड़ना होगा और इसके अस्तित्व के लिए परीक्षण करना होगा। या आप क्लास टेम्पलेट 'सी' को रिक्त वर्ग 'बेससी' से सार्वजनिक रूप से प्राप्त कर सकते हैं और उस प्रकार से विरासत के लिए परीक्षण कर सकते हैं। यह जानना एक अजीब चीज है कि एक प्रकार का कुछ टेम्पलेट का तात्कालिकता है या नहीं; आम तौर पर जब तक कि कुछ ज्ञात इंटरफेस लागू करता है तब तक आप परवाह नहीं करते हैं। –