2012-04-04 13 views
5

करके एक टेम्पलेटविशेषज्ञ तर्क की सकारात्मकता के आधार पर टेम्पलेट

template <int n> 
void f(){...}; 

मैं जानता हूँ कि मैं n के विशिष्ट मानों के लिए यह विशेषज्ञ कर सकते हैं को देखते हुए:

template <> 
void f<2>(){...}; 

लेकिन, एक तरीका है जिसके लिए मुझे अनुमति देता है सभी सकारात्मक n के लिए इसे विशेषज्ञ बनाने के लिए?

मैं निम्नलिखित

template <int n> 
void f<n>(){ 
    int dummy[n]; //invalid for n < 0 
    ... 
}; 

कर के बारे में सोचा तो n<0 के लिए इस कोड को अमान्य है और संकलक पिछली परिभाषा का सहारा होगा। दुर्भाग्य से, मुझे लगता है कि एक redefinition of 'void f<n>()' त्रुटि है।

नोट: मुझे लगता है कि यह शायद मानक द्वारा समर्थित नहीं है। मैं पूछ रहा हूं कि इस प्रभाव को प्राप्त करने के लिए कुछ विधि (शायद कुछ टेम्पलेट मेटाप्रोग्रामिंग) नहीं है।

उत्तर

13

एक विकल्प संकेत के दूसरे स्तर का उपयोग करना होगा। दो तर्कों में एक सहायक टेम्पलेट को परिभाषित करें - संख्या n और bool प्रतिनिधित्व करता है कि n नकारात्मक है या नहीं, तो n नकारात्मक होने पर उस टेम्पलेट को विशेषज्ञ बनाएं। फिर, अपने f फ़ंक्शन को सही तर्क के साथ टेम्पलेट को तुरंत चालू करें।

उदाहरण के लिए

:

template <int n, bool isNegative> struct fImpl { 
    static void f() { 
     /* ... code for when n is positive ... */ 
    } 
}; 
template <int n> struct fImpl<n, true> { 
    static void f() { 
     /* ... code for when n is negative ... */ 
    } 
}; 

template <int n> void f() { 
    fImpl<n, (n < 0)>::f(); 
} 

एक अन्य विकल्प SFINAE overloading और से सी ++ 11 (या बूस्ट के समकक्ष) std::enable_if टेम्पलेट वर्ग का उपयोग करने के लिए है;

template <int n> void f(typename std::enable_if<(n < 0)>::type* = 0) { 
    /* ... n is negative ... */ 
} 

template <int n> void f(typename std::enable_if<(n >= 0)>::type* = 0) { 
    /* ... n is positive ... */ 
} 

इन कार्यों में से प्रत्येक केवल अधिभार समाधान के लिए उपलब्ध हो जाएगा अगर n, उचित संकेत है, ताकि सही संस्करण हमेशा बुलाया जाएगा।

आशा है कि इससे मदद मिलती है!

+5

शैली का मामला, लेकिन मैं वापसी प्रकार पर 'enable_if' रखना पसंद करता हूं इसलिए भ्रमित चीजों (उपयोगकर्ताओं और फ़ंक्शन के प्रकार) के आसपास लटकने वाला जादू पैरामीटर नहीं है। – GManNickG

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

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