2014-04-15 9 views
6

"सूर्य के नीचे कभी भी नया नहीं है" के नियम के तहत परिचालन करते हुए, मुझे संदेह है कि मैं इस चाल के साथ आने वाला पहला व्यक्ति हूं। मैंने सोचा कि मैं अंततः ऑनलाइन दस्तावेज में कुछ ठोकर खाऊंगा, लेकिन मैंने अभी तक नहीं किया है, इसलिए मुझे लगा कि मैं पूछूंगा।क्या इस 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); 
}; 
+0

यह एक दिलचस्प विचार है - अनिवार्य रूप से सदस्य फ़ंक्शन पॉइंटर्स को पैरामीटर करना। जावास्क्रिप्ट में, आप "प्रोटोटाइप" ऑब्जेक्ट बना सकते हैं और इस प्रकार सशर्त रूप से कुछ सदस्य फ़ंक्शन बना सकते हैं। मैंने सी ++ में कुछ भी नहीं देखा है। जवाब देखने के लिए उत्सुक ... –

+0

इसके लिए प्रेरक उपयोग केस था, हमारे पास बहु-आयामी रेखा और बॉक्स कक्षाएं भी थीं जो मानक बिंदु लेती थीं, लेकिन हमने पिछली बार पॉइंट 2 और पॉइंट 3 के लिए कक्षाएं ली थीं, इसलिए उपयोगी 2 डी और 3 डी पॉइंट कार्य कक्षाओं के लिए दोनों ही सुलभ नहीं थे (जब तक कि हम उन्हें भी प्राप्त नहीं कर लेते थे, इस मामले में यह एक पुनर्मूल्यांकन होगा क्योंकि सदस्य बदल गए थे और बहुत सारे सामान्य कोड थे, डीआरवाई), लेकिन कोड के किसी भी हिस्से में भी जो बॉक्स और लाइन एल्गोरिदम का इस्तेमाल करता था। इसलिए हमने महसूस किया कि SFINAE का उपयोग क्लीनर था, भले ही यह उजागर कार्यों को थोड़ा असंगत बना देता। – OmnipotentEntity

+0

'enable_if' का दोहराव उपयोग क्यों पैटर्न बनना चाहिए? यह 'enable_if' का एक सामान्य अनुप्रयोग है - उदा। [cppreference के विवरण] पर विचार करें (http://en.cppreference.com/w/cpp/types/enable_if) "* प्रकार के गुणों के आधार पर ओवरलोड रिज़ॉल्यूशन से सशर्त रूप से कार्यों और कक्षाओं को हटाएं और विभिन्न प्रकार के लक्षणों के लिए अलग-अलग फ़ंक्शन ओवरलोड और विशेषज्ञता प्रदान करें * "... ऐसा लगता है कि आपने पूरी तरह से पर्याप्त रूप से क्या किया है। –

उत्तर

4

मैं इसे एक पैटर्न नहीं कहूंगा, लेकिन यह एक ज्ञात तकनीक है।

अधिकतर सशर्त इंटरफेस के रूप में इनकार किया गया यह तकनीक मुख्य रूप से एक कक्षा के इंटरफेस को चालू और बंद करने के लिए एक संकलन समय टॉगलिंग तंत्र की समस्या को संबोधित करती है। समग्र प्रक्रिया सदस्यों के अस्तित्व को टॉगल करने के लिए टूल प्रदान करती है (इसलिए सशर्त संकलन जन्म हो जाता है)।

तकनीक आपके द्वारा प्रस्तावित तरीके से कम या ज्यादा लागू होती है (हालांकि उपनाम टेम्पलेट्स की कमी सी ++ 11 से पहले कोई समस्या नहीं थी) और सामान्य समस्या भारी, अव्यवस्था, भ्रमित और "बदसूरत" टेम्पलेट मशीनरी है बॉयलरप्लेट कोड।

इस समस्या को संबोधित करते हुए, ए अलेक्जेंड्रेसक्यूgave a presentation विषय के बारे में। शुरू में ऐसी तकनीक के लिए की जरूरत के एक छोटे से उल्लेख है:

enter image description here

गोली जो कहता है

  • यह फ़ंक्शन केवल संख्या

अपने तकनीक के लिए reffering जाता है और साथ काम करता है कार्यों (अस्तित्व इंटरफ़ेस) के अस्तित्व को टॉगल करने के लिए समय सशर्त संकलन करने की आवश्यकता है।

यह बात के लिए एक नई भाषा सुविधा के प्रस्ताव पर जाती है। चूंकि हम सभी ने पहिया का आविष्कार किया है कि वह दो बार कहता है, क्यों नहीं एक नई भाषा वाक्यविन्यास, जो हमें ऐसी चीजों को करने की अनुमति देगा। joint workएच। सटर, static if एक संकलित समय टॉगलर जो आपके द्वारा उल्लेख किए गए कार्यों के रूप में कामकाज की आवश्यकताओं को हटा देगा। इसका एक सरल उपयोग

template<int D> 
struct Vector 
{ 
    double coordinates[D]; 
    static if (D) { 
     double x() { return coordinates[0]; } 
    } 
    static if (D > 1) { 
     double y() { return coordinates[1]; } 
    } 
    static if (D > 2) { 
     double z() { return coordinates[2]; } 
    } 
}; 

ठीक है शायद यह इसका सबसे स्मार्ट उपयोग नहीं है, लेकिन मुझे लगता है कि मैं इस विचार को संप्रेषित कर रहा हूं।

विरोधी पक्ष पर अब, बी Stroustroup प्रकाशित किया है एक paper जहां समस्याओं static if संबोधित कर रहा है aknowledging के बाद, वह बताता है कि क्यों यह एक त्रुटिपूर्ण अवधारणा (यमक इरादा :)) है और इसे अपनाने के लिए एक आपदा होगा भाषा (आउच!)।

यह मेरा दो सेंट था, इस "वार्तालाप" में प्रतिभागियों के स्तर से निर्णय लेना, मैं इस बात के बारे में कुछ प्रतिक्रिया देना चाहता हूं कि वे किन पक्ष पर हैं, या यदि वे मानकीकरण प्रक्रिया का हिस्सा हैं क्या वे मतदान करेंगे।

+1

मुझे ज्यादा इतिहास नहीं पता है, लेकिन हो सकता है कि यह तब हुआ जब अलेक्जेंड्रेस्को ने आगे बढ़ने का फैसला किया [डी रास्ता] (http://dlang.org/cpptod.html#metatemplates) ... – iavr

संबंधित मुद्दे