"सूर्य के नीचे कभी भी नया नहीं है" के नियम के तहत परिचालन करते हुए, मुझे संदेह है कि मैं इस चाल के साथ आने वाला पहला व्यक्ति हूं। मैंने सोचा कि मैं अंततः ऑनलाइन दस्तावेज में कुछ ठोकर खाऊंगा, लेकिन मैंने अभी तक नहीं किया है, इसलिए मुझे लगा कि मैं पूछूंगा।क्या इस SFINAE पैटर्न का नाम है?
इसका उद्देश्य कुछ कार्यों को चुनिंदा रूप से सक्षम करना है, बशर्ते वे व्युत्पन्न कक्षा का उपयोग किए बिना प्रासंगिक हों।
क्या इस पैटर्न के लिए कोई नाम है? और क्या किसी के पास इस पैटर्न या पैटर्न पर कोई उपयोगी जानकारी है जो समान रूप से संचालित होती है?
template<typename T, size_t N>
class Point {
public:
template<size_t P, typename T2=void>
using Enable2D = typename std::enable_if<P == 2 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable3D = typename std::enable_if<P == 3 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable4D = typename std::enable_if<P == 4 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable2DOrHigher = typename std::enable_if<P >= 2 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable3DOrHigher = typename std::enable_if<P >= 3 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable4DOrHigher = typename std::enable_if<P >= 4 && N == P, T2>::type;
//Example use cases
template<size_t P=N>
static Enable2D<P, Point> withAngle(T angle, T magnitude = 1);
template<size_t P=N>
static Enable3D<P, Point> fromAngles(T psi, T theta, T magnitude = 1);
template<size_t P=N>
Enable2DOrHigher<P, T> const& x() const;
template<size_t P=N>
Enable2DOrHigher<P, T> const& y() const;
template<size_t P=N>
Enable2DOrHigher<P> setX(T const& t);
template<size_t P=N>
Enable2DOrHigher<P> setY(T const& t);
template<size_t P=N>
Enable3DOrHigher<P, T> const& z() const;
template<size_t P=N>
Enable3DOrHigher<P> setZ(T const& t);
template<size_t P=N>
Enable4DOrHigher<P, T> const& w() const;
template<size_t P=N>
Enable4DOrHigher<P> setW(T const& t);
};
यह एक दिलचस्प विचार है - अनिवार्य रूप से सदस्य फ़ंक्शन पॉइंटर्स को पैरामीटर करना। जावास्क्रिप्ट में, आप "प्रोटोटाइप" ऑब्जेक्ट बना सकते हैं और इस प्रकार सशर्त रूप से कुछ सदस्य फ़ंक्शन बना सकते हैं। मैंने सी ++ में कुछ भी नहीं देखा है। जवाब देखने के लिए उत्सुक ... –
इसके लिए प्रेरक उपयोग केस था, हमारे पास बहु-आयामी रेखा और बॉक्स कक्षाएं भी थीं जो मानक बिंदु लेती थीं, लेकिन हमने पिछली बार पॉइंट 2 और पॉइंट 3 के लिए कक्षाएं ली थीं, इसलिए उपयोगी 2 डी और 3 डी पॉइंट कार्य कक्षाओं के लिए दोनों ही सुलभ नहीं थे (जब तक कि हम उन्हें भी प्राप्त नहीं कर लेते थे, इस मामले में यह एक पुनर्मूल्यांकन होगा क्योंकि सदस्य बदल गए थे और बहुत सारे सामान्य कोड थे, डीआरवाई), लेकिन कोड के किसी भी हिस्से में भी जो बॉक्स और लाइन एल्गोरिदम का इस्तेमाल करता था। इसलिए हमने महसूस किया कि SFINAE का उपयोग क्लीनर था, भले ही यह उजागर कार्यों को थोड़ा असंगत बना देता। – OmnipotentEntity
'enable_if' का दोहराव उपयोग क्यों पैटर्न बनना चाहिए? यह 'enable_if' का एक सामान्य अनुप्रयोग है - उदा। [cppreference के विवरण] पर विचार करें (http://en.cppreference.com/w/cpp/types/enable_if) "* प्रकार के गुणों के आधार पर ओवरलोड रिज़ॉल्यूशन से सशर्त रूप से कार्यों और कक्षाओं को हटाएं और विभिन्न प्रकार के लक्षणों के लिए अलग-अलग फ़ंक्शन ओवरलोड और विशेषज्ञता प्रदान करें * "... ऐसा लगता है कि आपने पूरी तरह से पर्याप्त रूप से क्या किया है। –