के साथ सदस्य फ़ंक्शन है SFINAE के साथ समस्या हो रही है। मुझे यह निर्धारित करने में सक्षम होना चाहिए कि किसी प्रकार का सदस्य फ़ंक्शन ऑपरेटर है-> इसके रिटर्न प्रकार के बावजूद परिभाषित किया गया है। उदाहरण निम्नानुसार है।SFINAE - यह निर्धारित करने का प्रयास कर रहा है कि टेम्पलेट प्रकार में 'चर' रिटर्न प्रकार
परीक्षक में यह कक्षा। यह एक्स * के रिटर्न प्रकार के साथ ऑपरेटर ->() को परिभाषित करता है। इस प्रकार मैं नहीं जानता कि 'एक्स' हर जगह इसे हार्डकोड करना है।
template <class X>
class PointerX
{
...
X* operator->() const;
...
}
यह कक्षा निर्धारित करने की कोशिश करती है कि पास में टी में एक विधि ऑपरेटर-> परिभाषित है; चाहे ऑपरेटर-> वापसी प्रकार क्या है।
template<typename T>
struct HasOperatorMemberAccessor
{
template <typename R, typename C> static R GetReturnType(R (C::*)()const);
template<typename U, typename R, R(U::*)()const> struct SFINAE{};
template<typename U> static char Test(SFINAE<U, decltype(GetReturnType(&U::operator->)), &U::operator-> >*);
template<typename U> static uint Test(...);
static const bool value = sizeof(Test<T>(0)) == sizeof(char);
};
यह कक्षा उपरोक्त के समान सटीक है- ऑपरेटर-> वापसी प्रकार 'ऑब्जेक्ट' होना चाहिए।
template<typename T>
struct HasOperatorMemberAccessorOBJECT
{
template <typename R, typename C> static R GetReturnType(R (C::*)()const);
template<typename U, typename R, R(U::*)()const> struct SFINAE{};
template<typename U> static char Test(SFINAE<U, Object*, &U::operator-> >*); // only change is we hardcoded Object as return type.
template<typename U> static uint Test(...);
static const bool value = sizeof(Test<T>(0)) == sizeof(char);
};
परिणाम:
void main()
{
HasOperatorMemberAccessor<PointerX<Object>>::Test<PointerX<Object>>(0); // fails ::value is false; Test => Test(...)
HasOperatorMemberAccessorOBJECT<PointerX<Object>>::Test<PointerX<Object>>(0); // works! ::value is true; Test => Test(SFINAE<>*)
}
HasOperatorMemberAccessor PointX के सदस्य समारोह "->() स्थिरांक वस्तु ऑपरेटर" खोजने में असमर्थ था। तो यह टेस्ट के जेनेरिक संस्करण टेस्ट (...) का उपयोग करता है।
हालांकि, हैस्परेटरमम्बरएसेसर ओबीजेईसीटी पॉइंटएक्स के "ऑब्जेक्ट ऑपरेटर ->() कॉन्स" को खोजने में सक्षम था। इस प्रकार यह टेस्ट विशेष संस्करण टेस्ट (SFINAE *) का उपयोग करता है।
दोनों "ऑब्जेक्ट ऑपरेटर ->() कॉन्स्ट" विधि खोजने में सक्षम होना चाहिए; और इस प्रकार दोनों को टेस्ट के विशेष संस्करण टेस्ट (SFINAE *) का उपयोग करना चाहिए; और इस प्रकार HasOperatorMemberAccessor> :: मान दोनों के लिए सच होना चाहिए।
HasOperatorMemberAccessor और HasOperatorMemberAccessorOBJECT के बीच फर्क सिर्फ इतना है कि HasOperatorMemberAccessorOBJECT typename आर आपत्ति उठाने hardcoded है,
तो मुद्दा यह है कि "decltype (GetReturnType (& यू :: ऑपरेटर>))" नहीं लौटा रहा है वस्तु है सही ढंग से। मैंने रिटर्न प्रकार की खोज करने के कई अलग-अलग परमिट की कोशिश की है। वे निम्नानुसार जाते हैं:
decltype(GetReturnType(&U::operator->))
typename decltype(GetReturnType(&U::operator->))
decltype(((U*)nullptr)->operator->())
typename decltype(((U*)nullptr)->operator->())
कोई काम नहीं, क्यों? मैं एमएसवीसी ++ 10.0 का उपयोग कर रहा हूँ।
एक बात है कि आंख हमलों कि 'PointerX :: ऑपरेटर>' 'रिटर्न bool *', नहीं 'bool' है। –
पॉइंटरएक्स में एक्स का प्रकार कोई फर्क नहीं पड़ता है जहां तक हैस्परेटर मेम्बरएस्कर का संबंध है। मैंने उदाहरण के लिए कई अपरिपक्व वस्तुओं को जोड़कर मेरी समस्या को सामान्य करने की कोशिश की। यदि यह बहुत भ्रमित है, तो मैं स्ट्रिंग में बूल बदल दूंगा। –
मुझे दोबारा प्रयास करने दो। 'पॉइंटरएक्स